抽象类型和交互作用的问题作为泛型类型params与new()约束

Zom*_*man 2 c# generics constraints

我需要将泛型类型参数作为接口,但是我想在泛型类(SomeGenericType)中实例化类型,如下所示:

class Program
{
    static void Main(string[] args)
    {
        var val = new SomeGenericType<ISomeInterface>();

        Console.ReadKey();
    }
}

internal class SomeGenericType<T> where T : new()
{
    public SomeGenericType()
    {
        var test = new T();  
    }
}

public class SomeClass : ISomeInterface
{
    public string TestVal { get; set; }
}

public interface ISomeInterface
{
    string TestVal { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这会抛出以下编译时错误:

"ISomeInterface必须是具有公共无参数构造函数的非抽象类型,以便在泛型类型或方法SomeGenericType中将其用作参数'T'"

我理解为什么会这样,但是我想知道这个问题是否有任何解决办法?

谢谢.

Dav*_*d M 6

不,new()约束要求可以使用语法创建类型的实例

new T()
Run Code Online (Sandbox Code Playgroud)

这显然不适用于抽象类或接口,只是具有公共无参数构造函数的具体类.

您可以通过删除约束将问题推迟到运行时,并使用:

Activator.CreateInstance<T>()
Run Code Online (Sandbox Code Playgroud)

而是创建对象.然后,只要运行时使用的实际类型满足这些约束,您的代码就会按照您的意愿运行.但是,如果您尝试使用接口或抽象类,则会遇到运行时错误.

在您的特定情况下,此行将引发异常

var val = Activator.CreateInstance<SomeGenericType<ISomeInterface>>();
Run Code Online (Sandbox Code Playgroud)

您已经过了编译时错误,但没有效果.