获取具有自定义属性的类,其中customproperty具有特定值

时间:2014-05-21 10:57:04

标签: c# reflection

我已经实现了一个类似于以下内容的属性类:

internal class DataExchangeItem : Attribute
{
   public DataExchangeItem(string request)
   {
      Request = request;
   }

   public string Request { get; set; }
}

现在我有几个类,我使用这个属性,如:

[DataExchangeItem("DownloadDataRequest")]
internal class DownloadDataRequestHandler : IDataHandler
{ ... }

我有一个带有一个看起来像

的静态方法的类
public static Class RequestHandlerCreator
{
   public static IDataHandler CreateDataHandler(string request)
   {
      switch(request){... // compare strings and give DataHandler}
   }
}

现在我正在尝试用一个语句替换switch语句,在那里我可以检查所有类的属性,然后在属性Request-property中获取具有搜索到的请求字符串的类。

要获取我的属性定义的所有Type的列表,我使用:

List<Type> customAttributes = (from type in Assembly.GetExecutingAssembly().GetTypes()
                                    where type.GetCustomAttributes(typeof(DataExchangeItem),true).Length > 0
                                    where type.GetCustomAttributesData().Count > 0
                                    select type).ToList();

我知道我可以在type.GetCustomAttributesData() - Type上致电Object以获取CustomAttributeData的列表。每个CustomAttributeData - Property都有一个NamedArguments集合。

不幸的是,我没有管理它来获取Type - 我搜索过的字符串的对象。

我现在的问题是:

  

如何在我的custom-attribute所在的程序集中获取Type   已定义并且Request-Property具有我的搜索值?


谢谢荷兰人。你的代码有效。我用linq语句完全改变了它:

 private static Type FindTypeForRequest(string request)
        {
            return (from module in Assembly.GetExecutingAssembly().Modules 
                    where module.GetTypes().Length > 0 
                    from type in module.GetTypes() 
                    where type.CustomAttributes.Any() 
                    let customAttribute = type.CustomAttributes.SingleOrDefault(a => a.AttributeType == typeof (DataExchangeItem)) 
                    where customAttribute != null 
                    where customAttribute.ConstructorArguments.Any(argument => argument.Value.ToString() == request) 
                    select type).FirstOrDefault();
        }

1 个答案:

答案 0 :(得分:1)

好的,我就是这样做的:

 public Type CreateDataHandler(string requestName)
    {
        Assembly _assembly = Assembly.GetExecutingAssembly();
        foreach (Module _module in _assembly.Modules)
        {
            if (_module.GetTypes().Length > 0)
            {
                foreach(Type _type in _module.GetTypes())
                {
                    if (_type.CustomAttributes.Count() > 0)
                    {
                        CustomAttributeData _customAttribute = _type.CustomAttributes.SingleOrDefault(a => a.AttributeType == typeof(DataExchangeItem));
                        if (_customAttribute != null)
                        {
                            foreach (var _argument in _customAttribute.ConstructorArguments)
                            {
                                if (_argument.Value.ToString() == requestName)
                                {
                                    return _type;
                                }
                            }
                        }
                    }
                }
            }
        }
        return null;
    }

让我知道这是否成功。