问题查找自定义属性
Issue finding custom attributes
我试图在我的程序集中找到所有具有自定义属性的方法。我已经尝试过此处发布的其他解决方案,但我似乎无法获得关于哪些方法具有我正在寻找的属性类型的任何结果。希望有人能指出我做错了什么。
[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
但是,您的问题是 "find all the methods in my assembly" 因此,如果您只打算将此属性应用于方法,那么您应该更改
[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);
注意:这会使用指定自定义属性的 CustomAttributeData
列表填充 results
变量,就像原始代码示例一样,而不是 MethodInfo
包含方法的列表原始问题中描述的自定义属性。
我试图在我的程序集中找到所有具有自定义属性的方法。我已经尝试过此处发布的其他解决方案,但我似乎无法获得关于哪些方法具有我正在寻找的属性类型的任何结果。希望有人能指出我做错了什么。
[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
但是,您的问题是 "find all the methods in my assembly" 因此,如果您只打算将此属性应用于方法,那么您应该更改
[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);
注意:这会使用指定自定义属性的 CustomAttributeData
列表填充 results
变量,就像原始代码示例一样,而不是 MethodInfo
包含方法的列表原始问题中描述的自定义属性。