2014-01-29 116 views
0

一般来说,函数类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

完全不清楚你在问什么,你想检查'func'方法是否有'Atr'属性? –

+0

我想确定具有该属性的类的类型。 例如,如果我调用任何具有属性的类中的任何方法,请检查Atr确定类型。 – askeet

回答

0

您可以使用大会反思,找出所有在他们的方法,装饰用给定属性的类:

看看在枚举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 
} 

注意:你必须确保你列举了正确的类型(参见类型类IsClass属性) ,但为了清晰起见,我将其留下。

希望这会有所帮助!

+0

Thansk的想法。也许你可以得到项目命名空间?搜索具有相对于它的属性的类的方法? – askeet

相关问题