创建将参数作为辅助泛型类型的泛型类型的实例

时间:2017-02-10 10:24:58

标签: c# generics abstract

我有一个名为Factory

的抽象类

工厂有一个方法createModel()

public abstract class Factory<T, U>{

    public T CreateModel(IDictionary<String, Object> parametersDictionary)
        {
            T toReturn;

            if (ValidateDictionary(parametersDictionary) != true)
                 return null;
            else
            {
                 toReturn = new T(U);
            }


            return toReturn;
        }}

在else语句中,我想创建一个Car实例来获取CarPart对象,我将从另一个方法调用中获取该对象。此逻辑将应用于其他Factory子类型,因此我想继承此方法。问题是我无法使用另一个Generic参数创建Car泛型实例。

我环顾四周,发现我可以使用Activator类。

  

(T)Activator.CreateInstance(typeof运算(   Car),args);

但是,只有当您想要为构造函数提供某种类型时,这似乎才有效。

我也尝试过:

  

public abstract class Factory其中T:new()

但这并没有让我解析构造函数的任何参数。

如何实现这个抽象类?

Edit1:更改了说明的命名

Edit2:为了澄清,U是一个包含创建T所需的大约20个参数的结构。所以为了创建一个新的T,我需要传递一个U对象来封装所有必需的20个参数。

1 个答案:

答案 0 :(得分:0)

在Abion47指出Activator.CreateInstance应该没有任何问题做我需要它做的事情后,我看了一下这个问题,并让它工作。

对于任何可能遇到此问题的人:

public abstract class Sentinel<T,U> where T: new() where U: new() 
{
    public T CreateModel(IDictionary<String, Object> parametersDictionary)
    {
        T toReturn ;

        if (ValidateDictionary(parametersDictionary) != true)
            return default(T);
        else
        {
            U parameters = ParseDictionaryToParameters(parametersDictionary);
            toReturn = (T)Activator.CreateInstance(typeof(T), new object[] {parameters});
        }

        //If we got this far then everything should be fine.
        return toReturn;
    }

    public abstract U ParseDictionaryToParameters(IDictionary<String, Object> parametersDictionary);

    public abstract Boolean ValidateDictionary(IDictionary<String, Object> parametersDictionary);
}