【问题标题】:C# 泛型创建新实例
【发布时间】:2022-01-23 15:14:25
【问题描述】:

我正在尝试基于以下myMethod 编写一个泛型方法

void myMethod(myClassA instanceA, myClassB instanceB)
{
    instanceA = new myClassA(instanceB);
}

到目前为止,我得到的是这样的 (myMethod_new),其中有一些错误:

void myMethod_new<S, T>(S instanceA, T instanceB) where S : new()
{
    instanceA = new S(instanceB);
}

但是,由于我还没有掌握泛型在C#中的工作原理,应该如何实现呢?

【问题讨论】:

  • 这段代码有问题。 A 的一个实例被传递给 myMethod,然后使用 new myClassA(in​​stanceB) 创建一个新实例。你能纠正你的意图吗?
  • 嗯,这只是一个尝试,这就是我要解决的问题

标签: c# generics


【解决方案1】:

如果泛型类型在构造函数中具有参数,则不能创建该泛型类型的新实例。来自docs(强调我的):

新约束指定泛型类声明中的类型参数必须有一个公共无参数构造函数。

一种选择是使用Activator.CreateInstance 并传入所需的参数。但是,这可能会导致运行时异常,因为调用者可以传入具有任何构造函数格式的任何类型。

我的建议是通过删除构造函数参数来稍微重构并创建一个方法来传递该值,然后使用一个接口来约束它。例如:

// The interface
public interface IHasThing<T>
{
    void SetThing(T value);
}

// An implementation of the interface
public class Foo : IHasThing<string>
{
    private string _value;
    
    public void SetThing(string value)
    {
        _value = value;
    }
}

以及返回新对象的更新方法:

public S myMethod_new<S, T>(T instanceB) where S : IHasThing<T>, new()
{
    var s = new S();
    s.SetThing(instanceB);
    return s;
}

所以现在你可以像这样调用方法了:

var foo = myMethod_new<Foo, string>("bar");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-03
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 2019-12-17
    • 2013-02-17
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多