创建一个引用另一个对象参数的变量?

时间:2018-05-05 14:55:14

标签: c#

我有一个非常具体的问题。 我有一个具有相同类型的各种属性的自定义类,我在其他地方有一个方法需要在类上运行并比较这些属性。该方法需要能够比较这些属性,但需要根据具体情况比较不同的属性。

就目前而言,我有一个开关,它接受一个字符串来确定要比较的属性:

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 }

1 个答案:

答案 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; }
}