我正在尝试查找程序集中所有具有自定义属性的方法。我已经尝试了这里发布的其他解决方案,但我似乎无法得到任何关于哪些方法具有我正在寻找的属性类型的结果。希望有人能指出我做错了什么。
[AttributeUsage(AttributeTargets.All)]
public class RPCAttributeType : Attribute
{
private string _name;
private double _version;
public double Version
{
get { return _version; }
set { _version = value; }
}
public string Name
{
get { return _name; }
set { _name = value; }
}
public RPCAttributeType(string name)
{
Name = name;
Version = 1.0;
}
}
public RPCModule()
{
try
{
Assembly assembly = Assembly.ReflectionOnlyLoad("Parser");
var results = CustomAttributeData.GetCustomAttributes(assembly);
ShowAttributeData(results);
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
}
[RPCAttributeType("Select")]
public DataRow[] Select(string expression)
{
return MessageDataTable.Select(expression);
}
您可以使用RPCAttributeType 获取所有方法的列表
var results = assembly.GetTypes().SelectMany(t => t.GetMethods())
.Where(m => m.GetCustomAttributes(typeof(RPCAttributeType), true).Count() > 0).ToList();
编辑:基于评论
分配组件时使用
var assembly = Assembly.GetExecutingAssembly();
您的代码只检查程序集级别的属性。
由于您的属性可以应用于类、方法、属性等,因此您需要通过反射循环所有这些内容来定位您的属性。
概念上类似于。。。
foreach assembly
foreach type
foreach property
foreach method
foreach field
然而,你的问题是"在我的程序集中找到所有方法",所以如果你只打算将此属性应用于方法,那么你应该更改
[AttributeUsage(AttributeTargets.All)]
至:
[AttributeUsage(AttributeTargets.Method)]
然后,您可以使用Praveen的解决方案来检查所有类型中的方法,而不必担心属性、字段等。
使用原始示例的ReflectionOnlyLoad,可以这样做:
Assembly assembly = Assembly.ReflectionOnlyLoad("Parser");
var results = assembly.GetTypes()
.SelectMany(t => t.GetMethods())
.SelectMany(m => CustomAttributeData.GetCustomAttributes(m)
.Where(c => c.AttributeType.FullName == typeof(RPCAttributeType).FullName))
.ToList();
ShowAttributeData(results);
注意:这将为results
变量填充指定自定义属性的CustomAttributeData
列表,就像原始代码示例一样,而不是原始问题中描述的包含自定义属性的方法的MethodInfo
列表。