如何通过它自己的属性获取对象的引用?

时间:2013-08-04 06:13:49

标签: c# oop object reflection

在WPF中,你有很多类可以传递一个属性进行处理;例如ValueConverters,RuleValidations等。将属性转换为正确的类型并使用它。

但我经常需要某些特定对象的其他属性来进行计算和比较值。

最后一天看来,我一直在试验丑陋的东西,例如将整个对象作为参数传递,只是为了获取实例对象。

必须有办法从其中一个属性中获取对象吗?

我该怎么做?

例如在此代码中:

public class Car
{
    public string Brand { get; set; }
    public string Color { get; set; }
}

class Program
{
    public static void Main(string[] args)
    {
        Car car = new Car();

        car.Brand = "Porsche";
        car.Color = "Yellow";

        Test(car.Brand);
    }

    public static void Test(object value)
    {
        var brand = (String)value;

        // Get the Car object instance reference from the passed object?
        var carInstance = ...

            Console.WriteLine("This {0} has a {1} paint job",
                              brand, carInstance.Color);
    }
}

2 个答案:

答案 0 :(得分:1)

抱歉,但不可能。您无法从String(其品牌名称)值获取Car实例。 car.Brand不是代码中的属性(比如PropertyInfo),它只是String 的值。 试想一下:

   // Test(car.Brand);
   String brandName = car.Brand; // <- Just a string, nothing special
   Test(brandName);

即使我们使用Reflection,我们也无法获得Object instance ,我们唯一能得到的就是 class(类型):

  PropertyInfo pi = typeof(Car).GetProperty("Brand");
  ...
  Type tp = pi.ReflectedType; // <- Car; Type only, not instance

相反,您可以传递Car实例并获取所需的所有属性:

public static void Main(string[] args)
{
    Car car = new Car();

    car.Brand = "Porsche";
    car.Color = "Yellow";

    Test(car);
}

public static void Test(Car value)
{
   Console.WriteLine("This {0} has a {1} paint job", value.Brand, value.Color);
}

答案 1 :(得分:0)

您是否有理由不想传递整个物体?我认为,因为默认情况下的对象是通过c#中的引用传递的,所以传递一个int(一个引用是一种代表内存中特定位置的数字)并不比它更糟糕,所以它不应该杀了你传递整个对象的性能(除非你的对象是一个非常庞大的东西,你只需要2个属性)。