2011-07-14 3 views
6

リストからIDを返すメソッドがあります。 通常、私はこのタスクにリフレクションを使用します(クラスは通常インターフェイスまたは基本クラスを共有しないPOCOSであり、変更できませんので汎用メソッドを使用することはできません)。しかし、私は新しいdynamicキーワードについて考えてみました。オブジェクトにC#動的メソッドを使用する

しかし、私の問題は、dataSource [index]がオブジェクトを返すことです。実行時には、オブジェクト自体が自分のクラスであり、idプロパティを持つことが保証されます。 しかし、私は、メソッドがオブジェクトを返すのでcurrent.id

public List<int> GetItemIds() 
{ 

    var result = new List<int>(); 
    var dataSource = GetDataSource(); // returns an List<Object> 

    for (int i = 0; i <= dataSource.Count - 1; i++) 
    { 
     dynamic current = dataSource[i]; 
     int id = current.Id; // throws RuntimeBinderException: Object has no definition for id 
    } 

    return result; 
} 

にアクセスしている間、私は、実行時にRumtineBinderExceptionを取得したと私がしたいか、私はidプロパティを取得するために後方反射に行かなければならないものをachiveする方法はあります?

更新:

current.GetType() returns object 
current.GetType().GetProperties() returns a TargetInvocationException 

マイPOCOS私のメインのプロジェクト(VB.net)に住んでいるが、この方法では、クラスlibaryであり、多分それが原因です。ただし、

object current = dataSource[i]; 
PropertyInfo prop = current.GetType().GetProperty("id", BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase); 
if (prop != null) 
{ 
    int id = (int)prop.GetValue(current, null); 
} 

作品です。

+0

current.GetType()は何ですか?それはあなたが期待しているタイプですか? –

+0

ここに何か問題があります...上記の例でdynamicを使用すると、ランタイムタイプにIdプロパティがある場合に動作するはずです... – Jeff

+0

これはうまくいくはずです - current.GetType()の情報でポストを更新できますか? 、およびcurrent.GetType()。GetProperties()? – carlosfigueira

答えて

1

GetDataSource()」の返品タイプを「List<dynamic>」と定義する必要があると思われる場合があります。

もちろん、コメントに記載されているように、オブジェクトにはプロパティ "id"が定義されている必要があります。

+0

私は、GetDataSource()をList というもので壊してはいけないと思っていますが、リストをタイプチェックして技術的にコンパイルしているので、リストは共変できません。 List が返された場合の例いずれにしても、解決策ではありません。なぜなら、インデックスの返されたオブジェクトを動的なものとして扱うようにコンパイラに依頼しているので、違いはありません。 – jbtule

1

動的キーワードを使用すると、C#も大文字と小文字が区別されます。あなたの呼び出しはint id = current.Id;ですが、プロパティが小文字のidであるとおっしゃって、あなたのリフレクションコールは大文字と小文字を区別しません。動的キーワードは、メソッドが見つからないと言うので、アセンブリの境界を越えてパブリックインスタンスのプロパティを呼び出す際に問題はありません。int id = current.id;

+0

私の実際の世界のアプリケーションでは、プロパティは小文字で、 'current.id'を使ってアクセスしました。 (しかし、私はそれをサンプルコードで混ぜています)。しかし、たとえ私がウォッチウィンドウのプロパティを参照したとしても、コードにアクセスすると失敗します。 –

関連する問題