我有以下代码:
public interface IParameter
{
ParameterName Name { get; set; }
}
public interface IParameter<T> : IParameter
{
T Value { get; set; }
T LLimit { get; }
T RLimit { get; }
}
public class IntegerParameter : IParameter<int>
{
public ParameterName Name { get; set; }
public int Value { get; set; }
public int LLimit { get; private set; }
public int RLimit { get; private set;}
public IntegerParameter(ParameterName name, int value, int llimit, int rlimit)
{
Name = name;
Value = value;
LLimit = llimit;
RLimit = rlimit;
}
}
public class DoubleParameter : IParameter<double>
{
public ParameterName Name { get; set; }
public double Value { get; set; }
public double LLimit { get; private set; }
public double RLimit { get; private set; }
public DoubleParameter(ParameterName name, double value, double llimit, double rlimit)
{
Name = name;
Value = value;
LLimit = llimit;
RLimit = rlimit;
}
}
// ...
代码是我正在组合的物理项目的一部分。 现在这是我的问题。我希望能够根据ParameterName在字典中添加参数,但仍然可以调用Value。
var A = new IntegerParameter(ParameterName.X1, 10, 0, 100);
var B = new DoubleParameter(ParameterName.X2, 56.4, 0, 78.6);
var set = new Dictionary<ParameterName,IParameter>();
set.Add(A.Name, A);
set.Add(B.Name, B);
set[A.Name].Value; // I cannot do it since the Value is expressed only in the IParameter<T> part
答案 0 :(得分:0)
如果没有改变你的arcihtecture,(顺便说一下,这应该是一个抽象的基类),你不能在同一个列表中混合使用int和double,并希望得到一个int或double。
您可以使用反射或
你可以用这种方式点缀它(我认为这是一个非常糟糕的设计,但它只是用于示例),在IParameter
界面中添加更多信息
使用基本抽象类
public interface IParameter
{
ParameterName Name { get; set; }
object GetValue();
Type Type { get; }
}
public interface IParameter<T> : IParameter where T : IConvertible
{
T Value { get; set; }
T LLimit { get; }
T RLimit { get; }
}
public abstract class BaseParameter<T> : IParameter<T> where T : IConvertible
{
protected BaseParameter(ParameterName name, T value, T llimit, T rlimit)
{
Name = name;
Value = value;
LLimit = llimit;
RLimit = rlimit;
}
public ParameterName Name { get; set; }
public object GetValue(){return Value;}
public Type Type{get { return typeof(T); }}
public T Value { get; set; }
public T LLimit { get; private set; }
public T RLimit { get; private set; }
}
public class IntegerParameter : BaseParameter<int>
{
public IntegerParameter(ParameterName name, int value, int llimit, int rlimit)
: base(name, value, llimit, rlimit)
{
}
}
public class DoubleParameter : BaseParameter<double>
{
public DoubleParameter(ParameterName name, double value, double llimit, double rlimit)
: base(name, value, llimit, rlimit)
{
}
}
用法:
var a = new IntegerParameter(ParameterName.X1, 10, 0, 100);
var b = new DoubleParameter(ParameterName.X2, 56.4, 0, 78.6);
var set = new Dictionary<ParameterName, IParameter>();
set.Add(a.Name, a);
set.Add(b.Name, b);
//ouch, ugly, isn't it ?
var test = Convert.ChangeType(set[a.Name].GetValue(), set[a.Name].Type);
var k = test.GetType();//I'm an int
test = Convert.ChangeType(set[b.Name].GetValue(), set[b.Name].Type);
k = test.GetType();//I'm a double