代码之家  ›  专栏  ›  技术社区  ›  Cheng Chen

是否有泛型类型属性的替换解决方案?

  •  1
  • Cheng Chen  · 技术社区  · 15 年前

    贝卡斯 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 回复  |  直到 15 年前
        1
  •  0
  •   Leon van der Walt    15 年前

    在您的示例中,通过将枚举更改为类,并使用接口而不是属性,您可以实现相同的功能。

    您可以使用测试接口实现 作为 ,还可以编写接口的扩展方法。

    还可以在错误类上实现方法,从而提供比普通旧枚举更大的范围。

    {
        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();
            }
        }
    
    }
    
        2
  •  4
  •   VinayC    15 年前

    那么,您可以在属性构造函数中接受类型或类型名参数。例如

    [CoHandler(typeof(AccessHandler))]
    

    [CoHandler("[Fully or partially qualified type name]")]
    

    前者使用起来更简单,而后者在您不想或不能依赖于包含类型的程序集时很有用。

    顺便说一句, return default(T); 将永远返回空值,我希望它只是为了说明目的。下面是示例,如何使用类型参数:

    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);
        }
    
    }
    
    推荐文章