将对象投射到其 class
Casting an object to its class
我正在尝试用两个变量创建一些 classes。其中一个变量是名称,另一个是值。对于每个 class 值可以是不同类型的变量(int、double 或 string)。
我想将这些 classes 的实例存储在列表中,所以我将 classes 放在抽象 class.
下
然后在 foreach 循环中,我想使用这些实例的值,但我需要将它们转换为它们的原始类型,以便 param.Set 函数将接受它。
我的代码是这样的:
List<ElementProperty> parameters = new List<ElementProperty>();
//I add my parameters to the list.
parameters.Add(new ElementProperty.String("TestName", "TestVariable"));
parameters.Add(new ElementProperty.Integer("TestName", 10));
//I want to make this foreach loop shorter and more proper
foreach (var parameter in parameters)
{
Parameter param = el.LookupParameter(parameter.Name);
if (parameter is ElementProperty.Boolean)
{
param.Set(((ElementProperty.Boolean)parameter).Value);
//param.Set only accepts int double and string
}
else if (parameter is ElementProperty.Double)
{
param.Set(((ElementProperty.Double)parameter).Value);
}
else if (parameter is ElementProperty.Integer)
{
param.Set(((ElementProperty.Integer)parameter).Value);
}
else if (parameter is ElementProperty.String)
{
param.Set(((ElementProperty.String)parameter).Value);
}
}
public abstract class ElementProperty
{
public string Name;
public object Value;
public class Integer : ElementProperty
{
public new int Value;
public Integer(string Name, int Value)
{
this.Name = Name;
this.Value = Value;
}
}
public class Double : ElementProperty
{
public new double Value;
public Double(string Name, double Value)
{
this.Name = Name;
this.Value = Value;
}
}
public class String : ElementProperty
{
public new string Value;
public String(string Name, string Value)
{
this.Name = Name;
this.Value = Value;
}
}
public class Boolean : ElementProperty
{
public new int Value;
public Boolean(string Name, bool Value)
{
this.Name = Name;
if (Value is false)
{
this.Value = 0;
}
else
{
this.Value = 1;
}
}
}
}
还有更好的选择吗?任何建议都会有很大帮助。
谢谢。
我更喜欢为此使用接口,但您可以这样做:
// ...
foreach (var parameter in parameters)
{
parameter.SetTo(param); // Call same interface
}
// ...
在每个具体的 类 中:
public class Integer : ElementProperty
{
public new int Value;
public Integer(string Name, int Value)
{
this.Name = Name;
this.Value = Value;
}
public void SetTo(Parameter p)
{
p.Set(this.Value); // calls correct overload
}
}
这在没有 switch/case 或 if/else 链的情况下完全有效。
但是,请注意使用此模式的冲动可能暗示了潜在的设计问题。这就是它有时被视为“代码味道”的原因。
我正在尝试用两个变量创建一些 classes。其中一个变量是名称,另一个是值。对于每个 class 值可以是不同类型的变量(int、double 或 string)。
我想将这些 classes 的实例存储在列表中,所以我将 classes 放在抽象 class.
下然后在 foreach 循环中,我想使用这些实例的值,但我需要将它们转换为它们的原始类型,以便 param.Set 函数将接受它。
我的代码是这样的:
List<ElementProperty> parameters = new List<ElementProperty>();
//I add my parameters to the list.
parameters.Add(new ElementProperty.String("TestName", "TestVariable"));
parameters.Add(new ElementProperty.Integer("TestName", 10));
//I want to make this foreach loop shorter and more proper
foreach (var parameter in parameters)
{
Parameter param = el.LookupParameter(parameter.Name);
if (parameter is ElementProperty.Boolean)
{
param.Set(((ElementProperty.Boolean)parameter).Value);
//param.Set only accepts int double and string
}
else if (parameter is ElementProperty.Double)
{
param.Set(((ElementProperty.Double)parameter).Value);
}
else if (parameter is ElementProperty.Integer)
{
param.Set(((ElementProperty.Integer)parameter).Value);
}
else if (parameter is ElementProperty.String)
{
param.Set(((ElementProperty.String)parameter).Value);
}
}
public abstract class ElementProperty
{
public string Name;
public object Value;
public class Integer : ElementProperty
{
public new int Value;
public Integer(string Name, int Value)
{
this.Name = Name;
this.Value = Value;
}
}
public class Double : ElementProperty
{
public new double Value;
public Double(string Name, double Value)
{
this.Name = Name;
this.Value = Value;
}
}
public class String : ElementProperty
{
public new string Value;
public String(string Name, string Value)
{
this.Name = Name;
this.Value = Value;
}
}
public class Boolean : ElementProperty
{
public new int Value;
public Boolean(string Name, bool Value)
{
this.Name = Name;
if (Value is false)
{
this.Value = 0;
}
else
{
this.Value = 1;
}
}
}
}
还有更好的选择吗?任何建议都会有很大帮助。 谢谢。
我更喜欢为此使用接口,但您可以这样做:
// ...
foreach (var parameter in parameters)
{
parameter.SetTo(param); // Call same interface
}
// ...
在每个具体的 类 中:
public class Integer : ElementProperty
{
public new int Value;
public Integer(string Name, int Value)
{
this.Name = Name;
this.Value = Value;
}
public void SetTo(Parameter p)
{
p.Set(this.Value); // calls correct overload
}
}
这在没有 switch/case 或 if/else 链的情况下完全有效。
但是,请注意使用此模式的冲动可能暗示了潜在的设计问题。这就是它有时被视为“代码味道”的原因。