gpt4 book ai didi

c# - 实例化类的通用字段

转载 作者:行者123 更新时间:2023-11-30 23:25:55 24 4
gpt4 key购买 nike

有没有办法让类中的泛型字段专门用于构造函数中的特定类型?

例如:

class concreteClass1
{
private int a;
public concreteClass1( int a)
{
this.a = a;
}
}

class concreteClass2
{
string b;
public concreteClass2(string b)
{
this.b = b;
}
}

class A<T>
{
private T field;
public A(int x)
{
field = new concreteClass1(x); //error here CS0029
}

public A(string y)
{
field = new concreteClass2(y); //error here CS0029
}
}

因此 T 可以是 concreteClass1concreteClass1 并且它们各自的 ctors 将具有不同的签名。

最佳答案

我会重构它以使用依赖注入(inject)。这样该类就不会包含创建它所依赖的其他类的代码,例如 myConcreteField = new ConcreteA<T>(4); .依赖注入(inject)用于防止代码陷入这样的难题。

(你的例子非常非常抽象,这让它有点困难。如果你使用像“具体”和“实现”这样的类名,那么它会使答案更难阅读,因为我们使用相同的词来描述概念。 )

相反,无论Concrete事情是,声明一个接口(interface),比如

public interface ISomethingThatTheOtherClassNeeds<T>
{
public int MySomething {get;set;}
}

public class SomethingThatTheOtherClassNeeds : ISomethingThatTheOtherClassNeeds<string>
{
public int MySomething {get;set;}
}

然后在你的Implementation类:

class Implementation<T>
{
private readonly ISomethingThatTheOtherClassNeeds<T> _something;

public Implementation(ISomethingThatTheOtherClassNeeds<T> something)
{
_something = something;
}

void DoSomething()
{
Console.Write(_something.MySomething.ToString());
}
}

不同之处在于,它不是负责创建该类的任何内容,而是传递给 Implementation在构造函数中。 Implementation甚至不知道类是什么 - 它只知道它与接口(interface)匹配。

如果其他类又依赖于更多类,这将特别有用。如果您通过调用 new 创建它们在您的类(class)中,该类(class)必须知道如何创建这些类(class)。

然后要将其连接起来,您将使用依赖项注入(inject)容器,例如 Windsor、Unity、Autofac 等。这在控制台应用程序中并不常见,但我猜这是实验性的,而不是真实的。

关于c# - 实例化类的通用字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37079007/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com