我有一个非常具体的问题。 我有一个具有相同类型的各种属性的自定义类,我在其他地方有一个方法需要在类上运行并比较这些属性。该方法需要能够比较这些属性,但需要根据具体情况比较不同的属性。
就目前而言,我有一个开关,它接受一个字符串来确定要比较的属性:
switch(field)
{
case "int1":
if (myClass1.int1 < myClass2.int1)
{
//do something
}
break;
case "int2":
if (myClass1.int2 < myClass2.int2)
{
//do something
}
break;
}
有没有办法我可以设置一个变量来引用我想要引用的类的属性,这将允许只使用开关并让代码稍后比较属性?像这样:
var referrer;
switch(field)
{
case "int1":
referrer = int1;
break;
case "int2":
referrer = int2;
break;
}
if (myClass1.referrer < myClass2.referrer)
{ //do something }
答案 0 :(得分:2)
您可以使用Func<T, int>
方法执行此操作,例如:
public class SomeClass
{
public int First { get; set; }
public int Second { get; set; }
}
var one = new SomeClass { First = 1, Second = 5 };
var two = new SomeClass { First = 5, Second = 1 };
Func<SomeClass, int> referrer = null;
switch (field)
{
case "first":
referrer = x => x.First;
break;
case "second":
referrer = x => x.Second;
break;
}
if (referrer(one) < referrer(two))
{
}
当然,这假设您总是想要比较int
属性。看看here。
还有另一种方法,如果你想完全避免使用switch
,那就是使用反射:
public class Program
{
public static void Main()
{
var one = new SomeClass { First = 1, Second = 5 };
var two = new SomeClass { First = 5, Second = 1 };
string field = "First";
if (GetValue(one, field) < GetValue(two, field))
{
Console.WriteLine("one is smaller than two");
}
else
{
Console.WriteLine("one is greater than two");
}
}
private static int GetValue(SomeClass someClass, string field) => Convert.ToInt32(typeof(SomeClass).GetProperty(field).GetValue(someClass));
}
public class SomeClass
{
public int First { get; set; }
public int Second { get; set; }
}