代码之家  ›  专栏  ›  技术社区  ›  jstuardo

无法为接口添加约束

  •  3
  • jstuardo  · 技术社区  · 6 年前

    我有这个界面:

    namespace Common.Extensions
    {
        public interface IExtension
        {
            string FriendlyName { get; }
            string Description { get; }
        }
    }
    

    在其他类方法中,我有以下定义:

    public void LoadExtensions<T>(T tipo) where T : Common.Extensions.IExtension
    {
    
    }
    

    在该方法的主体中,我有以下内容:

    T extension = Activator.CreateInstance(t) as T;
    

    其中“t”是从DLL动态加载的类型。该类型实现IExtension接口。

    使用该代码,我收到以下编译时错误:

    The type parameter 'T' cannot be used with the 'as' operator because it does not have a class type constraint nor a 'class' constraint
    

    根据文件,我所尝试的是有效的。这里缺少什么?

    詹姆

    3 回复  |  直到 6 年前
        1
  •  7
  •   Titian Cernicova-Dragomir    6 年前

    这个 as 运算符只能与引用类型或可为null的类型一起使用( reference )。如果接口由结构实现 无法使用它。

    可以约束 T 成为一个班级

    public void LoadExtensions(T tipo) where T : class, Common.Extensions.IExtension
    

    也可以使用常规演员阵容:

    T extension = (T)Activator.CreateInstance(t);
    

    注意事项

    您还可以添加 new() 强制方法的约束 T 要使用默认构造函数来避免运行时问题,并且根本不使用强制转换,请执行以下操作:

    public static void LoadExtensions<T>(T tipo) where T : IExtension, new()
    {
        T extension = new T();
    }
    
        2
  •  2
  •   Thomas Flinkow    6 年前

    因为您正在使用 as 接线员,很明显 T cannot be a struct ,它只会是 class

    因此,您可以按照错误消息所说的做 添加类约束 像这样:

    public void LoadExtensions<T>(T tipo) where T : class, Common.Extensions.IExtension
    {                                     ^^^^^^^^^^^^^^^
    
    }
    
        3
  •  0
  •   Steve Harris    6 年前

    您需要将要约束为类的class关键字包括在内:

    public void LoadExtensions<T>(T tipo) where T : class, Common.Extensions.IExtension
    

    但在我看来,您应该使用该接口,因为您不需要知道访问其方法的类型:

    Common.Extensions.IExtension extension = (Common.Extensions.IExtension)Activator.CreateInstance(t);