C# 在类上未指定类型参数的情况下创建泛型类型成员变量

C# 在类上未指定类型参数的情况下创建泛型类型成员变量,c#,generics,C#,Generics,我为不清楚的标题道歉,我真的不知道该怎么说。我将用代码演示 public class CalculationService { private static Calculator<StaticInstrument, StaticResult> _staticCalculator; private static Calculator<DynamicInstrument, DynamicResult> _dynamicCalculator; priva

我为不清楚的标题道歉,我真的不知道该怎么说。我将用代码演示

public class CalculationService
{
    private static Calculator<StaticInstrument, StaticResult> _staticCalculator;
    private static Calculator<DynamicInstrument, DynamicResult> _dynamicCalculator;
    private static readonly object IsInitializedLock = new object();

    public byte[] ProcessStatic()
    {
        lock (IsInitializedLock)
        {
            _staticCalculator = new Calculator<StaticInstrument, StaticResult>();
        }

        return _staticCalculator.Calculate();
    }

    public byte[] ProcessDynamic()
    {
        lock (IsInitializedLock)
        {
            _dynamicCalculator = new Calculator<DynamicInstrument, DynamicResult>();
        }

        return _dynamicCalculator.Calculate();
    }
}
但是,如果不在
CalculationService
上指定类型信息,我就无法创建
私有静态计算器\u Calculator
成员,而我不能使用WCF

我能想到的唯一办法就是

private static dynamic _calculator;
还有别的办法吗?如果可能的话,我宁愿避免使用动态,我不确定性能影响会是什么,如果有的话。

您可以使用继承“烧掉”类型,以避免WCF抱怨

public class StaticCalculator:Calculator<StaticInstrument, StaticResult> {}
public class DynamicCalculator:Calculator<DynamicInstrument, DynamicResult> {}

public class CalculationService
{
    private static StaticCalculator _staticCalculator;
    private static DynamicCalculator _dynamicCalculator;
    ...
public类StaticCalculator:Calculator{}
公共类动态计算器:计算器{}
公共类计算服务
{
专用静态计算器(StaticCalculator);;
专用静态动态计算器\u动态计算器;
...

我以前这样做是为了解决WCF对泛型类型参数缺乏支持的问题。

我想我不理解你后来关于“我的CalculationService类上只有一个Calculator实例”的评论;相反,在我看来,您需要每个实例一个实例,就像您最初发布的代码一样。我认为下面的代码可以满足您的需要(另外,静态初始化规则将在正确的时间线程安全地构造计算器)

公共类计算服务{
私有静态类内部{
公共静态只读计算器\u计算器;
静态内部(){
_计算器=新计算器();
}
}
公共字节[]ProcessStatic(){
返回内部。_calculator.Calculate();
}
公共字节[]ProcessDynamic(){
返回内部。_calculator.Calculate();
}
}

如果您只想要一个版本的服务,您不能有一个单一的
\u计算器
变量。简单的方法是使用某种版本的查找结构(如字典等)并查找适当的计算器。使用
t仪器
TResult
的组合作为计算器的键

然后,您可以使用
typeof
操作符获取密钥。类似于:

_calculators = new Dictionary<Type,<Dictionary<Type,Calculator<TInstrument, TResult>>>();
...
var key1 = typeof(TInstrument);
var key2 = typeof(TResult);
var calculator = _calculators[key1].[key2];
...

\u calculators=new dictionars检查这一点,为什么不在客户端处理对象并取消数据的装箱,可能是使用类型安全的泛型包装器?不,问题是我只想在CalculationService类中有一个Calculator实例。具体的泛型类型可以正常工作。
public class CalculationService {
  private static class Inner<TInstrument, TResult> {
    public static readonly Calculator<TInstrument, TResult> _calculator;

    static Inner() {
      _calculator=new Calculator<TInstrument, TResult>();
    }
  }

 public byte[] ProcessStatic() {
    return Inner<StaticInstrument, StaticResult>._calculator.Calculate();
  }

  public byte[] ProcessDynamic() {
    return Inner<DynamicInstrument, DynamicResult>._calculator.Calculate();
  }
}
_calculators = new Dictionary<Type,<Dictionary<Type,Calculator<TInstrument, TResult>>>();
...
var key1 = typeof(TInstrument);
var key2 = typeof(TResult);
var calculator = _calculators[key1].[key2];
...