基于 ID 实例化属性,而无需复制代码



我正在尝试找到一种方法,在实例化具有不同属性的对象期间实现类似开关大小写的行为。

我的对象看起来像这样

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

我需要基于将类型映射到属性的交互器实例化我的类的实例 - 我正在设计的实例化函数如下所示:

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中的属性(顺便说一句,一个类的可怕名称(仅根据开关进行设置,该开关为字符串进行FooProperty,与类型int没有任何共同之处,则它们不应由公共类反映。使用类时,该类中的所有成员在某种意义上应该属于一起,而程序中并非如此。

但是,您可以使用泛型:

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

要创建实例,请调用以下命令:

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

现在,您无法将整数值分配给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);

对于一个 int-property。

最新更新