C#泛型:如何指定类型约束并返回泛型类型的实例

时间:2017-03-30 08:40:58

标签: java c# generics

在java 中我可以创建一个带有以下签名的方法:

public <E extends Form> E makeForm(Class<E> formType) {
    //return new instance of formType
} 

将类传递给受约束的方法,并返回该泛型类型的实例。通过这种方式,您可以执行以下操作:

makeForm(SomeForm.class).specificSomeFormMethod();

如何在C#中执行?从我到目前为止发现的情况来看,这是不可能的? 我可以为表单实例创建类型参数的泛型类型,但不能同时为两者,我也不知道如何将Type参数约束为特定类。

我不太清楚如何标记这个,所以这也许是我的问题。也许我会过度思考它?我需要另一个人的观点!

2 个答案:

答案 0 :(得分:4)

我认为你的意思是你想要泛型类型约束:

public E MakeForm<E>() where E : Form { }

where表示类型约束的开始。这里它表示E应该来自Form

你这样称呼它:

MyFormType form = MakeForm<MyFormType>();

如果你只有这种类型,那么你可以使用它:

public Form MakeForm(Type formType)
{
    return Activator.CreateInstance(formType) as Form;
}

Form form = MakeForm(typeof(MyFormType));

答案 1 :(得分:2)

您可以使用允许调用泛型类型的默认构造函数的new() type constraint

public class MakeForm<E> where E : FormType, new()
{
    // Method which returns a new E
    public E MakeForm()
    {
        return new E();   // this works because of the new() constraint
    }
}