我已经实现了一个类似于以下内容的属性类:
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();
}
答案 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;
}
让我知道这是否成功。