我正在尝试找到一种方法,在实例化具有不同属性的对象期间实现类似开关大小写的行为。
我的对象看起来像这样
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。