2011-12-20 3 views
0

私は書く方法がありますが、いくつかの共通点があると思います。私が見たいメソッドはオブジェクトと2つのものを取ります...まあ、私は2番目のものについてはあまり確かではありませんが、おそらく文字列です。ある一般的な方法を書く

オブジェクトはセットリスト(この場合、共通性はINotifyPropertyChangedインタフェースとINotifyPropertyChangedインタフェースの両方から継承しているように見える)からではあるが、汎用である必要があります。

文字列は、汎用オブジェクト内のプロパティの名前である必要があります。そのプロパティがそのオブジェクト内に存在するかどうかを調べてから、使用する前にそのオブジェクトが存在するかどうかを調べる必要があります(これは、そのプロパティでオブジェクトを比較する方法として使用されます)。

私はプロセスが...一般的なオブジェクトがメソッドに渡されることを推測します(プロパティ名文字列と共に)。オブジェクトにプロパティが含まれているかどうかを確認するチェック。そうであれば、引き続き 'object.PropertyName'にアクセスしてください。 'PropertyName'は指定された文字列です。

私はそれが簡単かどうかわかりませんが、賢明なのかどうかはわかりませんが、時間が節約できます。

このアドバイスを事前にお寄せいただきありがとうございます。

を編集してください。これまでのすべての返信をありがとう。私はいくつかのことを明確にしましょう:私が言ったとき、「アクセス」

明確化「...と何とか 『object.PropertyName』へのアクセス権を持っている」、私が意味することは方法がなければならないことでしたあたかもそのオブジェクトのプロパティであるかのようにそのプロパティ名を使用することができます。だから、渡された文字列が "ClientName"であったとしましょう。それが存在すると判断された場合、object.ClientNameを読み取る機能があります。 。私は

をやろうとしている何

私は、LINQのを使用してSQLデータベースにアクセスするWCFサービスを提供しています。私が言いましたオブジェクトは、SQLMetal.exeプログラムから生成されたエンティティなので、私のオブジェクトは 'Client'、 'User'、そしてこのようなものです。私はエンティティのリストを取ったメソッドを書いた。このメソッドは、コレクション内に存在しないエンティティのみを追加しました(重複している可能性のあるものもあります)。エンティティ内のプロパティ(データベースの列にあるデータに対応する)をチェックすることによって、重複したものがどれか分かりました。それは私が可変であるかもしれないと思ったプロパティです。

+0

は、「アクセス」は、平均していますか?書く?どちらも?または...?コンテキストを設定するには、あなたが尋ねることを行う*便利な方法はありません。リフレクションを使うことも、 'Expression'を解読することも、' get'と 'set'デリゲートの両方を渡すこともできます。バッキングフィールドを 'ref'として渡します。どのオプションが最も望ましい(または、少なくとも望ましくない)かは、あなたがしたいことに大いに左右されます**。だから... **あなたはそれと何をしたいのですか? –

+0

どのようにアクセスしますか?読む?書きます?どちらも? - Ha Marcが私を殴った。 – Nick

+0

厳密に型指定されていなければ、 'いいえ、あなたは単に' object.ClientName'を呼び出すことはできません。 PropertyInfoオブジェクトを取得するためにリフレクションを使用し、それを使用して、以下の私の答えのように、各オブジェクトのプロパティの値を見つける必要があります。 – Nick

答えて

1

ですね実際にそのタイプをチェックしないほうが簡単です。

private void Form1_Load(object sender, EventArgs e) 
{ 
    StringBuilder sb = new StringBuilder(); 

    PropertyInfo info = GetProperty(sb, "Capacity"); 
    //To get the value of the property, call GetValue on the PropertyInfo with the object and null parameters: 
    info.GetValue(sb, null); 
    //To set the value of the property, call SetValue on the PropertyInfo with the object, value, and null parameters: 
    info.SetValue(sb, 20, null); 
} 

private PropertyInfo GetProperty(object obj, string property) 
{ 
    PropertyInfo info = obj.GetType().GetProperty(property); 
    if (info != null && info.CanRead && info.CanWrite) 
     return info; 
    return null; 
} 

を、私は唯一のインデクサプロパティは、C#でパラメータを取ることができると思います。これは、プロパティが存在し、それが見つかった後、それは読み書き可能であり、それを使用する方法を示している場合かどうかを確認する方法を示しています。そして、VBでプロパティを書いてパラメータを取得し、C#でそのアセンブリを参照しようとすると、プロパティの代わりにメソッドとして表示されると思います。

また、2つのオブジェクトとプロパティ名の文字列を取ると一致するそれらの特性の結果を返します。このような関数を記述することができます。プロパティの値を比較

private bool DoObjectsMatch(object obj1, object obj2, string propetyName) 
{ 
    PropertyInfo info1 = obj1.GetType().GetProperty(propertyName); 
    PropertyInfo info2 = obj2.GetType().GetProperty(propertyName); 
    if (info1 != null && info1.CanRead && info2 != null && info2.CanRead) 
     return info1.GetValue(obj1, null).ToString() == info2.GetValue(obj2, null).ToString(); 
    return false; 
} 

は難しいかもしれませんので、オブジェクトとしてそれらを比較し、それらのために等価性がどのように処理されるかを知っている人。しかし、この場合、値を文字列に変換すると効果的です。

あなたは2つのオブジェクトが同じ型を知っているなら、あなたはそれを簡素化することができます:読むために:

private bool DoObjectsMatch(object obj1, object obj2, string propetyName) 
{ 
    PropertyInfo info = obj1.GetType().GetProperty(propertyName); 
    if (info != null && info.CanRead) 
     return info.GetValue(obj1, null).ToString() == info.GetValue(obj2, null).ToString(); 
    return false; 
} 
+0

こんにちはニック。答えをありがとう。私は2番目と3番目のコードサンプルの違いについて混乱しています。 info1とinfo2はどこから来ていますか? – TheFaithfulLearner

+0

Typo。 info1とinfo2はどちらもinfoだったはずです。それを私が直した。相違点は、第3はobj1とobj2が同じオブジェクトタイプであると仮定しているため、1のpropertyinfoが他方のものと同じになるためです。 2番目のものでは、同じタイプであるとはみなされないので、両方のプロパティ情報を取得します。 – Nick

1

は、私はあなたのような何かを探していると思う:あなたは本当にそれが特定のタイプだし、それがそうであるならば、あなたが持っていないかどうかを確認する必要がないように

public void SomeMethod<T>(T object, string propName) 
    where T : INotifyPropertyChanging, INotifyPropertyChanged 
(
    var type = typeof(T); 
    var property = type.GetProperty(propName); 

    if(property == null) 
     throw new ArgumentException("Property doesn't exist", "propName"); 

    var value = property.GetValue(object, null); 
) 
関連する問題