感谢we can't use generic type attributes,有没有替代解决方案?也许一个例子有助于讨论:
public abstract class ErrorHandler { }
public class AccessHandler : ErrorHandler { }
public class ConnectionHandler : ErrorHandler { }
public class OtherHandler : ErrorHandler { }
public class CoHandler<T> : Attribute where T : ErrorHandler
{
public T GetHandler()
{
return default(T); // just an example
}
}
public enum Errors
{
[CoHandler<AccessHandler>()]
Access,
[CoHandler<ConnectionHandler>()]
Connection,
[CoHandler<OtherHandler>()]
Other
}
答案 0 :(得分:4)
好吧,您可以在属性构造函数中接受类型或类型名称参数。例如
[CoHandler(typeof(AccessHandler))]
或
[CoHandler("[Fully or partially qualified type name]")]
以前使用起来比较简单,以后在您不想接受或不能依赖包含该类型的程序集时非常有用。
BTW,return default(T);
将始终返回null,我希望它仅用于说明目的。以下是示例,如何使用类型参数:
public class CoHandler : Attribute
{
private Type _Type;
public CoHandler(Type type)
{
_Type = type;
// Use reflection to validate type argument to see if it has
// inherited from ErrorHandler and check if its has parameterless
// constructor
}
public ErrorHandler GetHandler()
{
return (ErrorHandler)Activator.CreateInstance(_Type);
}
}
答案 1 :(得分:0)
在您的示例中,通过将枚举更改为类,并使用接口而不是属性,您可以实现相同的功能。
您可以使用 as 测试接口实现,还可以为接口编写扩展方法。
您还可以在Errors类上实现方法,提供比普通旧枚举更多的范围。
{
Errors error = Errors.Access;
var handler = error.GetHandler();
}
public abstract class ErrorHandler { }
public class AccessHandler : ErrorHandler { }
public class ConnectionHandler : ErrorHandler { }
public class OtherHandler : ErrorHandler { }
public interface CoHandler<T>
where T : ErrorHandler
{
T GetHandler();
}
public abstract class Errors
{
public static Errors Access = new AccessError();
public static Errors Connection = new ConnectionError();
public abstract ErrorHandler GetHandler();
private class AccessError : Errors, CoHandler<AccessHandler>
{
public override ErrorHandler GetHandler()
{
return new AccessHandler();
}
AccessHandler CoHandler<AccessHandler>.GetHandler()
{
return new AccessHandler();
}
}
private class ConnectionError : Errors, CoHandler<ConnectionHandler>
{
public override ErrorHandler GetHandler()
{
return new ConnectionHandler();
}
ConnectionHandler CoHandler<ConnectionHandler>.GetHandler()
{
return new ConnectionHandler();
}
}
}