这可能更像是一个设计问题,然后是“我可以这样做吗?”题。我正在创建一个属性,其目标定义为Method。是否有任何可能的方法对方法域施加限制,即目标方法必须声明为抽象,虚拟,静态等?
最终目标是扫描这些方法并在子类中实现它们 - 但我希望它们是抽象的。有没有更好的方法来实现对属性目标的伪限制?
答案 0 :(得分:3)
您应该能够使用MethodInfo.IsVirtual
和MethodInfo.IsAbstract
过滤掉使用您的属性修饰的非虚拟方法,以确定它是否是抽象的。
foreach(var assem in AppDomain.CurrentDomain.GetAssemblies())
foreach (var type in assem.GetTypes())
foreach (var mthdInfo in type.GetMethods())
{
if (mthdInfo.GetCustomAttributes(typeof(MyCustomAttribute), false) && mthdInfo.IsVirtual && !mthdInfo.IsFinal)
// This is a method you can use
}
有一些方法可以检测您列出的其他约束,并且方法应该类似。
编辑:已修复以回答方法的问题。
答案 1 :(得分:2)
不,抱歉。您可以在Inherited
中使用AttributeUsage
参数,但它可能对您有所帮助。
编辑:我知道这篇文章没有直接解决您的问题,但您可以应用它讨论的一些原则:
Restrict custom attribute so that it can be applied only to Specifc types in C#?