2013-11-20 33 views
5

我遇到了一点问题,这个问题并没有通过一般可用的解决方案解决,看似同样的问题。从动态生成的类中获取属性

考虑:

我有一组动态生成的类,从已知的基类继承(让称之为BaseClass)。 这些动态生成的类也具有动态生成的Properties及其相关属性。

的属性也是一个自定义类的,虽然不是动态生成的:

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

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

然后我想,当然运行时,取此分配属性值:

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

哪里targetBaseClass的一个子类。列表result是空的,这让我感到困惑。

我添加使用

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); 

其中dataType是在属性存储类型和tbTypeBuilder该类的属性。

如果我在属性上做了getCustomAttributes(),我会得到预期的属性,除了我正在寻找的属性。但是,如果我做getCustomAttributesData()我得到他们所有人,但我正在寻找的是CustomAttributeData类型,不是castable到TypeAttribute(如果我在VS调试器中检查实例,我可以看到包含的信息是为TypeAttribute )。 我猜这是问题的症状,但我找不到原因 - 更不用说解决方案了。

有人可以指出为什么result列表为空吗?

+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是我也创建的罪魁祸首,并且清空WPF应用程序,那就工作了。所以这是我的“真正的应用”。问题是搞清楚什么... – fredrik

+0

这样一个愚蠢的错误。暂时忘记将TypeAttribute声明为public将会导致这种情况。没有你的工作代码没有发现它。谢谢。 – fredrik

+0

当我尝试做'result [0] .GetCustomAttributes()'我在自动生成的程序集上得到'FileNotFoundException'。有什么想法我需要做什么? (ofc我检查至少有一个结果在列表中) – fredrik