如何创建传递给服务方法的泛型类型的实例?

时间:2019-06-25 03:10:28

标签: c# generics types casting

对于创建通用对象的实例,我有些困惑。我相信,它应该被铸造(以某种方式)。在我的代码中,我正在调用服务通用方法:

jockey = await _scrapDataService.ScrapSingleJockeyPlAsync<LoadedJockey>(id, jobType);

在我的服务方法中,我想实现这一目标,但是我不确定如何做到这一点:

public Task<T> ScrapGenericObject<T>(int id, string jobType)
        {
            var someObject = new T();
            return someObject;
        }

2 个答案:

答案 0 :(得分:1)

您需要new constraint

  

新约束指定泛型类中的任何类型参数   声明必须具有公共的无参数构造函数。要使用   新约束,类型不能是抽象的。

public Task<T> ScrapGenericObject<T>(int id, string jobType) where T : new()
{
    var someObject = new T();
    return someObject;
}

如果您需要传入任何构造函数,则必须使用其他方法Activator.CreateInstance

  

使用以下构造函数创建指定类型的实例:   与指定参数最匹配。

 return (T)Activator.CreateInstance(typeof(T), new object[] { param1, param2 });

答案 1 :(得分:1)

仅当您有通用类型约束告诉编译器您的类型具有公共无参数构造函数时,编译器才允许这样做。

您可以使用new()约束来实现此目标:

public Task<T> ScrapGenericObject<T>(int id, string jobType) where T: new()

然后,编译器知道可以通过new T()构造任何传入的类型。