我正在读取xml文件中的数据并具有以下switch语句
switch (localVariable)
{
case "myStringVariable":
myClass.myStringVariable= subReader.ReadElementContentAsString();
break;
case "myOtherStringVariable":
myClass.myOtherStringVariable= subReader.ReadElementContentAsString();
break;
case "myBoolVariable":
myClass.myBoolVariable= subReader.ReadElementContentAsBool();
break;
我想将此优化为类似
的内容switch (localVariable)
{
case "myStringVariable":
case "myOtherStringVariable":
myClass.localVariable= subReader.ReadElementContentAsString();
break;
case "myBoolVariable":
myClass.localVariable= subReader.ReadElementContentAsBool();
break;
答案 0 :(得分:1)
我的猜测是你想要这样的东西:
switch (localVariable)
{
case "myStringVariable":
case "myOtherStringVariable":
{
myClass.GetType()
.GetProperty(localVariable)
.SetValue(myClass,
subReader.ReadElementContentAsString(),
null);
break;
}
...
}
我应该同意其他人,他们在简单的场景中告诉我们避免反思。
答案 1 :(得分:1)
您正在寻找的(我推测)有时被称为“宏替换”,并且在C#中不可用。您可以使用反射来执行类似的操作来查找名称为localVariable
的属性,但除非您已设置了数十个属性和/或您希望防止不得不更改每当你添加一个属性时,它都可能不值得做。
答案 2 :(得分:1)
您可以使用反射更进一步:
将以下方法添加到您的班级:
private void SetVariableFromReader(string variableName)
{
var property = GetType().GetProperty(variableName);
if (property != null)
{
if (typeof(string).IsAssignableFrom(property.PropertyType))
{
property.SetValue(this, subReader.ReadElementContentAsString());
}
if (typeof(bool).IsAssignableFrom(property.PropertyType))
{
property.SetValue(this, subReader.ReadElementContentAsBool());
}
// ...
}
}
然后,您只需调用:
,而不是在代码中使用switch语句SetVariableFromReader(localVariable)
答案 3 :(得分:1)
使用FastMember库,正是为了这个目的, WAAAAY 比反射更快。
转到Nuget / Package Management控制台:
PM> Install-Package FastMember
然后:
public class Foo {
public string Bar { get; set; }
public string Baz { get; set; }
}
class Program {
public static void Main() {
Foo f = new Foo();
var wrapped = ObjectAccessor.Create(f);
string propName = "Baz";
wrapped[propName] = "Ah ha";
Console.WriteLine(f.Baz); //Prints Ah ha
}
}
或者,在您的情况下:
var myWrappedClass = ObjectAccessor.Create(myClass);
switch (localVariable) {
case "myStringVariable":
case "myOtherStringVariable":
myWrappedClass[localVariable] = subReader.ReadElementContentAsString();
break;
case "myBoolVariable":
myWrappedClass[localVariable] = subReader.ReadElementContentAsBool();
break;
}
完成并完成。真的很优雅。