泛型参数的构造函数要求?

时间:2011-05-25 19:05:04

标签: c# generics

查看this问题,我开始考虑如何在C#中处理构造函数需求。

假设我有:

T SomeMethod<T>(string s) : where T : MyInterface
{
    return new T(s);
}

我想在T上设置可以用字符串构造的要求,但据我所知,构造函数定义不允许作为接口的一部分。有没有一种标准的解决方法?

3 个答案:

答案 0 :(得分:4)

在界面中添加init方法或属性,

public interface MyInterface
{
    void Init(string s);
    string S { get; set; }
}

T SomeMethod<T>(string s) : where T : MyInterface, new()
{
    var t = new T();
    t.Init(s);

    var t = new T
    { 
        S = s
    };

    return t;
}

因为您无法指定构造函数约束的参数

答案 1 :(得分:2)

另一种方法是动态调用构造函数:

// Incomplete code: requires some error handling
T SomeMethod<T>(string s) : where T : MyInterface
{
    return (T)Activator.CreateInstance(typeof(T), s);
}

问题在于你失去了类型安全性:如果你试图将它与没有匹配构造函数的MyInterface实现一起使用,它将抛出异常。

答案 2 :(得分:1)

如果你想让它需要一个带字符串输入的构造函数,你需要实现一个抽象类:

public abstract class BaseClass<T>
{
     public BaseClass<T>(string input)
     {
         DoSomething(input);
     }

     protected abstract void DoSomething(string input);
}

您的派生类然后只是为抽象方法提供实现,然后它可以获取它想要的任何接口。

public class Sample<T> : BaseClass<T>, IMyInterface
{
    public Sample<T>(string input)
       : base(input)
    {
    }

    protected override void DoSomething(string input)
    {
    }

    public void MyInterfaceMethod()
    {
    }
}