我有以下属性定义:
[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 添加到属性所分配的方法中。我怎样才能做到这一点?也许有第三个参数需要委托或其他什么?
答案 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]
是相同的。