根据 class 个属性发出警告
Raising warnings based on class attributes
这是一些代码:
class Program
{
static void Main(string[] args)
{
MyClass class1 = new MyClass();
MyOtherClass class2 = new MyOtherClass();
Helper.UseAttribute<MyClass>(class1);
//Raise a warning to tell the developer that they cannot use this class
//as there is no property with the specified attribute.
Helper.UseAttribute<MyOtherClass>(class2);
}
}
public class MyAttribute : System.Attribute { }
class MyClass
{
[MyAttribute]
public string SomethingAwesome { get; set; }
}
class MyOtherClass
{
public string SomethingElseWhichIsAlsoPrettyAwesome { get; set; }
}
static class Helper
{
public static void UseAttribute<T>(T sender)
{
//Do something with the property that has MyAttribute
//If there isn't a property with this attribute, then raise
//a warning.
}
}
在理想情况下,我想限制开发人员将 classes 传递给不具有特定属性的方法。
我知道我可以使用一个接口,或者一些描述的基础 class,但是真正的问题是上面的例子是否可行。
如果您愿意使用 VS 2015 预览版或等到 VS 2015 发布,您可以使用 Roslyn。
你会写一个 DiagnosticAnalyzer
class,可能会注册一个语法节点分析器来专门查找 Helper.UseAttribute<T>
的调用。当您找到这样的用途时,您会找到 T
的符号并检查是否有任何应用了 MyAttribute
属性的属性,如果没有则发出警告。此警告将显示在 Visual Studio 本身中,并应用于 CI 构建(假设您正确注册了分析器程序集)。
开始使用 Roslyn 诊断 API 需要一段时间,但一旦您习惯了它,它真的 强大。
当然,另一种选择是在执行时抛出异常,并依赖于所有调用者周围的单元测试,以便您能够在它们失败时捕获它:)您可能应该这样做以及 通过 Roslyn 添加编译时支持。
你现在能做的最好的事情就是在运行时处理它(并抛出异常或其他东西)。关于design-/compiletime我觉得还没有可能。
public static void UseAttribute<T>(T sender)
{
var hasAttribute = typeof(T).GetProperties().Any(prop => Attribute.IsDefined(prop, typeof(MyAttribute)));
if (!hasAttribute)
throw new Exception("Does not contain attribute");
}
这是一些代码:
class Program
{
static void Main(string[] args)
{
MyClass class1 = new MyClass();
MyOtherClass class2 = new MyOtherClass();
Helper.UseAttribute<MyClass>(class1);
//Raise a warning to tell the developer that they cannot use this class
//as there is no property with the specified attribute.
Helper.UseAttribute<MyOtherClass>(class2);
}
}
public class MyAttribute : System.Attribute { }
class MyClass
{
[MyAttribute]
public string SomethingAwesome { get; set; }
}
class MyOtherClass
{
public string SomethingElseWhichIsAlsoPrettyAwesome { get; set; }
}
static class Helper
{
public static void UseAttribute<T>(T sender)
{
//Do something with the property that has MyAttribute
//If there isn't a property with this attribute, then raise
//a warning.
}
}
在理想情况下,我想限制开发人员将 classes 传递给不具有特定属性的方法。
我知道我可以使用一个接口,或者一些描述的基础 class,但是真正的问题是上面的例子是否可行。
如果您愿意使用 VS 2015 预览版或等到 VS 2015 发布,您可以使用 Roslyn。
你会写一个 DiagnosticAnalyzer
class,可能会注册一个语法节点分析器来专门查找 Helper.UseAttribute<T>
的调用。当您找到这样的用途时,您会找到 T
的符号并检查是否有任何应用了 MyAttribute
属性的属性,如果没有则发出警告。此警告将显示在 Visual Studio 本身中,并应用于 CI 构建(假设您正确注册了分析器程序集)。
开始使用 Roslyn 诊断 API 需要一段时间,但一旦您习惯了它,它真的 强大。
当然,另一种选择是在执行时抛出异常,并依赖于所有调用者周围的单元测试,以便您能够在它们失败时捕获它:)您可能应该这样做以及 通过 Roslyn 添加编译时支持。
你现在能做的最好的事情就是在运行时处理它(并抛出异常或其他东西)。关于design-/compiletime我觉得还没有可能。
public static void UseAttribute<T>(T sender)
{
var hasAttribute = typeof(T).GetProperties().Any(prop => Attribute.IsDefined(prop, typeof(MyAttribute)));
if (!hasAttribute)
throw new Exception("Does not contain attribute");
}