【问题标题】:How to create instance of a generic type passed to the service method? [duplicate]如何创建传递给服务方法的泛型类型的实例? [复制]
【发布时间】:2019-06-25 03:10:28
【问题描述】:

我对创建通用对象的实例有点困惑。我相信,它应该被铸造(不知何故)。在我的代码中,我调用了一个服务通用方法:

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

在我的服务方法中我想实现这一点,但我不知道该怎么做:

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

【问题讨论】:

  • 你打算用id和jobType做什么?您是否需要以某种方式将这些传递给T?

标签: c# generics types casting


【解决方案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 });

【讨论】:

  • 你说得对,如果我想使用对象的属性,我将不得不四处走动。
【解决方案2】:

只有当你有一个通用类型约束告诉编译器你的类型有一个公共的无参数构造函数时,编译器才会允许这样做。

您可以使用new() 约束来实现这一点:

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

那么编译器就知道你传入的任何类型都可以通过new T()构造。

【讨论】:

    猜你喜欢
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多