一般来说,在函数类A上有一个属性Atr,我想要另一个类B,Type得到它注册的类Atr。 在我的情况下,它应该是Type = typeof(A)只有没有A. 我希望你明白这个主意。谢谢你的回答。
以下是示例代码。
public class Atr: Attribute
{
public Atr()
{
DefaultDescription = "hello";
Console.WriteLine("I am here. I'm the attribute constructor!");
}
public String CustomDescription { get; set; }
public String DefaultDescription { get; set; }
public override String ToString()
{
return String.Format("Custom: {0}; Default: {1}", CustomDescription, DefaultDescription);
}
}
class B
{
public void Laun()
{
Type myType = typeof(A); // хочу получить тоже самое только через Atr
}
}
class A
{
[Atr]
public static void func(int a, int b)
{
Console.WriteLine("a={0} b={1}",a,b);
}
}
答案 0 :(得分:0)
您可以在Assembly上使用反射来查找具有使用给定属性修饰的方法的所有类:
查看Assembly.GetTypes方法(http://msdn.microsoft.com/en-us/library/system.reflection.assembly.gettypes%28v=vs.110%29.aspx)以枚举给定程序集中的所有类型。
查看Type.GetMethods以枚举给定类型(http://msdn.microsoft.com/en-us/library/424c79hc%28v=vs.110%29.aspx)中的所有公共方法。
然后最后,查看MemberInfo.CustomAttributes(http://msdn.microsoft.com/en-us/library/system.reflection.memberinfo.customattributes%28v=vs.110%29.aspx)以列出给定方法的所有自定义属性。 CustomAttributes的类型为CustomAttributeData,它具有属性AttributeType,您可以对其进行比较。
正如你可以猜到的那样,你需要循环的东西(3个嵌套循环),这不容易,相当复杂,更不用说慢,所以你可能想要装饰你班级的其他方面,或者尽可能完全改变你的方法。例如,如果您自己修饰类,它会变得更容易:Find all classes with an attribute containing a specific property value。
查找类类型的代码最终看起来像这样(完全未经测试):
Type aType = null;
foreach (Type t in Assembly.GetExecutingAssembly().GetTypes()) {
foreach (MethodInfo mi in t.GetMethods()) {
foreach (CustomAttributeData cad in mi.CustomAttributes) {
if (cad.AttributeType == typeof(Atr)) {
aType = t;
break;
}
}
}
}
if (aType == null) {
// not found
} else {
// found and aType = typeof(A) in your exmaple
}
注意:您必须确保枚举正确的类型(请参阅Type类的IsClass属性),但为了清楚起见,我将其留下了。
希望这有帮助!