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];
...