泛型类型属性的任何替代解决方案?

时间:2010-09-30 03:49:40

标签: c# .net generics attributes

感谢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
}

2 个答案:

答案 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();
        }
    }

}
相关问题