2013-11-20 18 views
5

私は少し問題に取り組みましたが、これは一般的に利用可能な解決方法では解決できません。動的に生成されたクラスから属性を取得する

は考えてみましょう:

を私は知られている基本クラスから継承し、動的に生成されたクラスのセットを持っている(BaseClassそれを呼び出すことができます)。 これらの動的生成クラスも、関連付けられた属性を持つPropertiesを動的に生成しました。動的に生成されていないが

属性は、カスタムクラスでもある:

List<PropertyInfo> result = target.GetType() 
    .GetProperties() 
    .Where(
    p => 
     p.GetCustomAttributes(typeof(TypeAttribute), true) 
     //.Where(ca => ((TypeAttribute)ca).) 
     .Any() 
    ) 
    .ToList(); 

[AttributeUsage(AttributeTargets.Property)] 
class TypeAttribute: Attribute 
{ 
    private Type _type; 
    public Type Type 
    { 
     get { return _type; } 
    } 

    public TypeAttribute(Type t) 
    { 
     _type = t; 
    } 
} 

は、それから私は、もちろんのランタイムは、この割り当てられた属性の値を取得したいですtargetBaseClassのサブクラスです。リストresultは空ですが、これが私を困惑させます。

私はdataTypeが属性に格納するタイプで、tbは、クラスのTypeBuilderある

PropertyBuilder propertyBuilder = tb.DefineProperty(propertyName, 
      PropertyAttributes.HasDefault, propertyType, null); 
ConstructorInfo classCtorInfo = typeof(TypeAttribute). 
      GetConstructor(new Type[] { typeof(Type) }); 
CustomAttributeBuilder myCABuilder = new CustomAttributeBuilder(
      classCtorInfo, new object[] { getType(dataType) }); 
propertyBuilder.SetCustomAttribute(myCABuilder); 

を使用して属性を追加します。

プロパティでgetCustomAttributes()を実行すると、私が探しているもの以外の予想される属性が得られます。しかし、私がgetCustomAttributesData()を実行した場合、私はそれらのすべてを取得しますが、私が探しているのはタイプCustomAttributeDataであり、TypeAttributeにキャストできません(VSデバッガのインスタンスを調べると、含まれている情報がTypeAttribute )。 これは問題の症状ではないかと推測していますが、その原因を見つけることはできません。

リストが空である理由を誰にでも指摘できますか?

+0

これは楽しいことです。それは私のためにテストリグをセットアップするために数分かかるでしょう...私はそれを行う間に誰かが明白な何かを見つけることを望んでいる! –

答えて

1

私にとってはうまく動作します。プロパティとゲッターまたはセッターメソッドが実際にプロパティとして表示されるほど十分に存在していますか?

​​

さらに、Attribute.IsDefinedを終了するのが気になる場合は、それを使用する方が効率的です。

List<PropertyInfo> result = target.GetType().GetProperties() 
     .Where(p => Attribute.IsDefined(p, typeof(TypeAttribute), true)).ToList(); 

も注意してください、私はgetType(dataType)ものを偽装しなければならなかったこと - それは問題ではなかったように私はそれが何をしているのか見ることができませんでした。それがTypeを返すことを確認してください。

+0

それはあなたが言うようにうまくいった。私は前に別の問題でそれを実行しようとしていないため、少し愚かな気がしますが、私はまだここにいるでしょうが、別の質問です。しかし、実際のアプリケーションにその作業コードをコピーすると、うまく動作しません。結果はゼロの長さのリストです。同じコードがWPFアプリケーションにコピーされました。私が作成したWPFアプリケーションを除外して、それがうまくいった原因を排除するために、それは機能しました。それは私の「本当の応用」の中にあるものです。問題は何を把握している... – fredrik

+0

そんなばかげた間違い。明らかに 'TypeAttribute'をpublicとして宣言するのを忘れると、これが起こります。あなたの作業コードなしでそれを発見していなかった。ありがとう。 – fredrik

+0

'result [0] .GetCustomAttributes()'を実行しようとすると、自動生成されたアセンブリで 'FileNotFoundException'が返されます。私は何をする必要があるか考えていますか? (少なくとも1つの結果がリストにあることを確認してください) – fredrik

関連する問題