gpt4 book ai didi

c# - 我可以在要创建的对象的类对泛型类型参数有约束的泛型类中创建泛型对象吗?

转载 作者:太空宇宙 更新时间:2023-11-03 11:27:59 25 4
gpt4 key购买 nike

我有一个通用接口(interface),

   public interface ICalculator<in T>
{
void Calculate(T input);
}

一个通用的计算器,

   public class GeneralCalculator<T> : ICalculator<T>
{
public void Calculate(T input)
{
bla bla
}
}

仅适用于某些类型的特定计算器,

   public class SpecificAndFastCalculator<T> : ICalculator<T> where T : ISpecificInterface
{
public void Calculate(T input)
{
bla bla
}
}

和一个装饰 ICalculators 的装饰器:

   public class CalculatorDecorator<T> : ICalculator<T>
{
private readonly ICalculator<T> component;

public CalculatorDecorator()
{
component = (typeof (ISpecificInterface).IsAssignableFrom(typeof (T)))
? new SpecificAndFastCalculator<T>() //Compiler Error
: new GeneralCalculator<T>();
}

public void Calculate(T input)
{
component.Calculate(input); bla bla
}
}

问题是,如您所见,编译器不接受调用 SpecificAndFastCalculator 的构造函数,因为它不知道 T 是否遵守约束 T : ISpecificInterface 即使我在运行时检查它。编译器可以是正确的,还是仅仅因为它不够聪明而拒绝代码?

有没有办法将组件字段分配给 SpecificAndFastCalculator

据我所知,我有以下选择:

  • SpecificAndFastCalculator 编写一个特定的装饰器组件,我认为这超过了装饰器的目的,
  • 以某种方式使用反射魔法(我不知道如何)
  • 删除 T : ISpecificInterface 约束,记录下来,并希望为了最好的。

还有别的办法吗?目前我选择第三种选择(删除约束),你有什么建议?

最佳答案

如果您更改 CalculatorDecorator<T> 的构造函数,它应该可以工作像这样:

public CalculatorDecorator()
{
component = (ICalculator<T>)(typeof (ISpecificInterface).IsAssignableFrom(typeof (T))
? typeof(SpecificAndFastCalculator<>)
.MakeGenericType(typeof(T))
.GetConstructor(new Type[0])
.Invoke(null)
: new GeneralCalculator<T>());
}

这将利用专门的实现,并仍然确保所有其他地方创建的实例也将使用它。

关于c# - 我可以在要创建的对象的类对泛型类型参数有约束的泛型类中创建泛型对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8780468/

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