将变量类型作为泛型传递给递归工厂

时间:2014-03-29 00:14:00

标签: c# .net generics types factory-pattern

当我碰到以下问题时,我正在尝试为教育目的编写自己的工厂方法;当试图递归调用我的函数时,我不能将指定的类型传递给泛型接收器。

注意:这可能与设计模式无关,这可能只是我做错的基本事情。无论哪种方式,我都有点难过。

public static T SpawnObject<T>()
{ 
    var objType = typeof(T);
    var parameters = objType.GetConstructors().Single().GetParameters();
    List<object> paramObjects;

    if (!parameters.Any()) return (T)Activator.CreateInstance(objType);

    paramObjects = new List<object>();
    foreach (var item in parameters)
    {
        //var arg = Activator.CreateInstance(item.ParameterType);
        var paramType = item.ParameterType;
        var arg = SpawnObject<paramType>(); // UNABLE TO ID 'PARAMTYPE' ??
        paramObjects.Add(arg);
    }

    T returnInstance = (T)Activator.CreateInstance(objType, paramObjects.ToArray());
    return returnInstance;
}

提前感谢任何可以帮助我理解为什么失败的人。

1 个答案:

答案 0 :(得分:2)

请参阅上面我链接的问题,为什么不能将变量用作类型参数。

这是一个简单的解决方案:

public static T SpawnObject<T>()
{
    return (T)SpawnObject(typeof(T));
}

private static object SpawnObject(Type objType)
{
    var parameters = objType.GetConstructors().Single().GetParameters();
    List<object> paramObjects;

    if (!parameters.Any()) return Activator.CreateInstance(objType);

    paramObjects = new List<object>();
    foreach (var item in parameters)
    {
        //var arg = Activator.CreateInstance(item.ParameterType);
        var paramType = item.ParameterType;
        var arg = SpawnObject(paramType);
        paramObjects.Add(arg);
    }

    return Activator.CreateInstance(objType, paramObjects.ToArray());
}