0

我有以下代码:

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
4

1 回答 1

0

如果不改变你的架构,(顺便说一下,这应该是一个抽象的基类)你不能在同一个列表中混合 int 和 doubles 并希望得到一个 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
于 2012-09-03T10:01:30.123 回答