捕获属性的目标

时间:2013-12-01 19:34:33

标签: c# methods attributes target

我有以下属性定义:

[System.AttributeUsage(System.AttributeTargets.Method)]
public class ClientFunction : System.Attribute {
    public static List<???> Targets = new List<???>();
    public string Display;
    public string Tooltip;

    public ClientFunction (string display, string tooltip = null) {
        Display = display;
        Tooltip = tooltip;
        // Add target method of this specific attribute to Targets
        Targets.Add(???);
    }
}

我想将 Targets 添加到属性所分配的方法中。我怎样才能做到这一点?也许有第三个参数需要委托或其他什么?

2 个答案:

答案 0 :(得分:4)

你不能这样做,属性不知道他们被分配到的类型/方法/等。

此外,属性构造函数不能将委托作为参数。属性的参数必须是编译时常量(例如,字符串,整数,枚举)。查看可用类型:http://msdn.microsoft.com/en-us/library/aa664615%28v=vs.71%29.aspx

如果要查找用属性修饰的所有方法,则必须使用反射并检查给定程序集中每种类型的每个方法,并检查这些方法是否已定义属性。

另请注意,按照惯例,所有属性的名称都应以“属性”一词为后缀。在您的情况下,ClientFunctionAttribute

答案 1 :(得分:2)

我认为你想要做的是:

    [System.AttributeUsage(System.AttributeTargets.Method)]
    public class ClientFunctionAttribute : System.Attribute
    {
        private static List<MethodInfo> _targets;
        public static List<MethodInfo> Targets
        {
            get
            {
                if (_targets == null)
                {
                    _targets = Assembly.GetExecutingAssembly().GetTypes()
                  .SelectMany(t => t.GetMethods())
                  .Where(m => m.GetCustomAttributes(typeof(ClientFunctionAttribute), false).Length > 0)
                  .ToList();
                }
                return _targets;
            }
        }
        public string Display;
        public string Tooltip;

        public ClientFunctionAttribute(string display, string tooltip = null)
        {
            Display = display;
            Tooltip = tooltip;
        }
    }

请在课程名称后添加属性后缀,您仍然可以在sqare括号中省略它,例如[ClientFunctionAttribute][ClientFunction]是相同的。