9

我在这里创建了一个名为 AAtribute 的自定义属性,例如一个名为 B 的类,其中一个或多个方法使用该属性。是否有可能在不遍历整个程序集并查看所有已定义方法的属性的情况下获取将属性(在本例中为 BMethod1)作为其属性(其中一个)的方法的 MethodInfo?它们是其他 AttributeTargets(参数/类型/属性/...)的模拟方式吗?我不想要使用该类型属性的所有方法的数组,而只想要具有此 Attirbute-object 的方法。我想用它对方法施加额外的约束(返回类型、参数、名称、其他属性使用,...)。

[AttributeUsage(AttributeTargets.Method)]
public class AAtribute : Attribute {

    //some fields and properties

    public AAtribute () {//perhaps with some parameters
        //some operations
        MethodInfo mi;//acces to the MethodInfo with this Attribute
                      //as an Attribute (the question)
        //some operations with the MethodInfo
    }

    //some methods

}

public class B {

    //some fields, properties and constructors

    [A]
    public void BMethod1 () {
        //some operations
    }

    //other methods

}
4

3 回答 3

2

如果我正确理解了您的问题,您想在属性 code中获取应用该属性的对象(在这种情况下为方法)。
我很确定没有直接的方法可以做到这一点 - 该属性不知道它所附加的对象,这种关联是相反的。

我可以建议您最好的解决方法如下:

using System;
using System.Reflection;

namespace test {

    [AttributeUsage(AttributeTargets.Method)]
    public class AAttribute : Attribute {
        public AAttribute(Type type,string method) {
            MethodInfo mi = type.GetMethod(method);
        }
    }

    public class B {
        [A(typeof(B),"BMethod1")]
        public void BMethod1() {
        }
    }
}

注意
您想通过访问属性构造函数中的 MethodInfo 来实现什么?也许有另一种方式来实现你的目标......

编辑

作为另一种可能的解决方案,您可以在属性中提供一个静态方法来进行检查 - 但这涉及迭代 MethodInfos。

using System;
using System.Reflection;
namespace test {

    [AttributeUsage(AttributeTargets.Method)]
    public class AAttribute : Attribute {
        public static void CheckType<T>() {
            foreach (MethodInfo mi in typeof(T).GetMethods()) {
                AAttribute[] attributes = (AAttribute[])mi.GetCustomAttributes(typeof(AAttribute), false);
                if (0 != attributes.Length) {
                    // do your checks here
                }
            }
        }
    }

    public class B {
        [A]
        public void BMethod1() {
        }
        [A]
        public int BMethod2() {
            return 0;
        }
    }

    public static class Program {
        public static void Main() {
            AAttribute.CheckType<B>();
        }
    }
}
于 2009-08-28T10:19:06.657 回答
2

我认为答案是否定的。或者至少不是以合理的方式。只有在通过 MethodInfo 查找属性时,才会构造属性的实例。实例化具有该属性的方法的类不会实例化该属性。只有在您开始四处寻找通过反射找到它们时,才会创建属性实例。

于 2009-08-28T10:37:55.590 回答
0

要确定一个方法是否应用了一个属性,您已经有了 MethodInfo。

var type = obj.GetType();
foreach(var method in type.GetMethods())
{
    var attributes = method.GetCustomAttributes(typeof(AAtribute));
    if(attributes.Length > 0)
    {
        //this method has AAtribute applied at least once
    }
}

于 2009-08-28T10:02:05.897 回答