根据ID实例化属性,无需重复代码

Instantiate property based on ID without duplicating code

我正在尝试找到一种方法来在实例化具有不同属性的对象期间实现类似 switch case 的行为。

我的对象是这样的

class FooProperty
{
    Nullable<int> IntergerValue {get; set;}
    Nullable<bool> BoolValue {get; set;}
    Nullable<float> FloatValue {get; set;}
    string StringValue {get; set;}
}

我需要根据将类型映射到 属性 的整数来实例化 class 的实例 - 我正在设计的实例化函数如下所示:

public void Instantiate(int mappingKey, object value)
{
    //Instantiate either interger, bool, float or string based on mappingKey
}

这里的关键点是我不要想要制作这样的开关盒

switch(mappingKey)
{
    case 1:
        new FooProperty
        {
            IntergetValue = (int) value
        };
        break;
    case 2:
        //BoolValue etc.
}

由于大量代码重复。我在想必须有一种更聪明的方法来决定要实例化哪个 属性 而不会每次都重复对象实例化。

这个设计好像坏了。如果 FooProperty 中的属性(顺便说一句。class 的可怕名称)仅根据开关设置 FooProperty 与类型 [=] 没有任何共同之处的字符串17=] 它们不应该被普通的 class 反映出来。当使用 class 时,class 中的所有成员在某种意义上应该属于一起,这在您的程序中不是这种情况。

但是您可以为此使用泛型:

class FooProperty<T>
{
    T Value {  get; set; }
}

要创建实例,请调用:

var foo = new FooProperty<string>();
foo.Value = "Hell World";

现在您不能将 int 值分配给 FooProperty.Value,因为它是字符串类型。

您还可以创建一个工厂方法来创建 FooProperty:

的实例
static FooProperty<T> Instantiate<T>(T value)
{
    return new FooProperty<T> { Value = value };
}

您可以像这样轻松调用:

var newInstance = Instantiate("Hello World")

对于字符串或

var newInstance = Instantiate(3);

对于一个整数-属性。