我试图在程序集中找到具有自定义属性的所有方法。我已经尝试了这里发布的其他解决方案,但我似乎无法获得有关哪些方法具有我正在寻找的属性类型的任何结果。希望有人可以指出我做错了什么。
[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);
}
答案 0 :(得分:2)
您可以使用RPCAttributeType
获取所有方法的列表var results = assembly.GetTypes().SelectMany(t => t.GetMethods())
.Where(m => m.GetCustomAttributes(typeof(RPCAttributeType), true).Count() > 0).ToList();
编辑:基于评论
分配程序集时使用
var assembly = Assembly.GetExecutingAssembly();
答案 1 :(得分:2)
您的代码仅检查程序集级属性。
由于您的属性可以应用于类,方法,属性等,因此您需要使用反射遍历所有这些内容以找到属性。
概念上类似......
foreach assembly
foreach type
foreach property
foreach method
foreach field
但是,您的问题是“查找程序集中的所有方法”,因此如果您只打算将此属性应用于方法,则应更改
[AttributeUsage(AttributeTargets.All)]
为:
[AttributeUsage(AttributeTargets.Method)]
然后你可以使用Praveen的解决方案来检查所有类型的方法,而不用担心属性,字段等。
答案 2 :(得分:1)
使用原始示例的 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
列表如原始问题所述。