【问题标题】:Capture Attribute's target捕获属性的目标
【发布时间】:2013-12-01 19:34:32
【问题描述】:

我有以下属性定义:

[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。我怎样才能做到这一点?也许有第三个参数需要委托或其他东西?

【问题讨论】:

标签: c# methods attributes target


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢 :) 我不知道这个。
【解决方案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;
        }
    }

并且请在类名后面加上属性后缀,方括号中仍然可以省略,比如[ClientFunctionAttribute][ClientFunction]是一样的。

【讨论】:

  • 这就是我要找的。也谢谢你:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多