实现可以包含不同类型属性的泛型类的最佳方法

时间:2015-09-29 12:34:20

标签: c#

我在C#中创建一个需要存储参数的类。该参数可以是不同类型的,例如float,int等甚至是类似Vector3类的类。

如何在C#中设计?我之前在C ++中使用Qt的QVariant类完成了这个。有关说明,请参阅以下UML图。

UML class diagram

因此,我们的想法是拥有一个存储一个值的Parameter类。该值可以是各种类型。您可以使用像ToFloat()这样的方法将值转换为float(如果可以的话)。

这可以用System.Object类实现(我认为)。但这不是我认为最好的选择。如果以这种方式实施,性能就不那么好:性能:Boxing and Unboxing

1 个答案:

答案 0 :(得分:0)

根据Daniel的建议,我使用了从参数派生的模板类。这是我使用的代码:

public class Parameter {

    public System.Type type { get; private set; }

    protected Parameter(System.Type type) {
        this.type = type;
    }

    public bool IsA<T>() {
        return type.Equals(typeof(T));
    }

    public T Get<T>() {
        return ((ParameterType<T>)this).val;
    }

    static public Parameter Create<T>(T defaultVal) {
        return new ParameterType<T>(defaultVal);
    }
}

class ParameterType<T> : Parameter {

    public T val { get; set; }

    public ParameterType() : base(typeof(T)) {

    }

    public ParameterType(T value) : base(typeof(T)) {
        this.val = value;
    }
}

样本用法:

List<Parameter> parameters = new List<Parameter>();
parameters.Add(Parameter.Create<int>(15));
parameters.Add(Parameter.Create<float>(10F));

int val1 = parameters[0].Get<int>();
float val2 = parameters[1].Get<float>();

// This will throw a InvalidCastException as intended
double val3 = parameters[0].Get<double>();