【问题标题】:Instantiate property based on ID without duplicating code基于ID实例化属性不重复代码
【发布时间】:2017-03-22 07:52:42
【问题描述】:

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

我的对象是这样的

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.
}

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

【问题讨论】:

    标签: c# generics instantiation


    【解决方案1】:

    这个设计好像坏了。如果FooProperty 中的属性(顺便说一句,一个类的可怕名称)仅根据开关进行设置,该开关为一个与int 类型没有任何共同之处的字符串创建FooProperty,它们不应该被反映一个普通的班级。当使用一个类时,该类中的所有成员在某种意义上应该属于一起,而在您的程序中并非如此。

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

    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);
    

    对于 int 属性。

    【讨论】:

      猜你喜欢
      • 2020-12-27
      • 2017-09-05
      • 2015-09-05
      • 1970-01-01
      • 2020-03-09
      • 2021-03-07
      • 1970-01-01
      • 2016-03-31
      • 2021-10-07
      相关资源
      最近更新 更多