【问题标题】:How to get a reference to an object via one of it's own properties?如何通过对象自己的属性之一获取对对象的引用?
【发布时间】:2013-08-04 06:13:48
【问题描述】:

在 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);
    }
}

【问题讨论】:

  • 我建议,如果您尝试获取的值多于传递的值,则您的代码架构需要调整...如果您需要一个字符串,请传递一个字符串,如果您需要一个对象,传一个...

标签: c# oop object reflection


【解决方案1】:

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

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

即使我们使用Reflection,也无法获取Objectinstance,唯一能获取的就是 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);
}

【讨论】:

    【解决方案2】:

    您是否有不想传递整个对象的原因?我认为由于默认情况下对象是在 c# 中通过引用传递的,它并不比传递一个 int 差多少(引用是一种代表内存中特定位置的数字)所以它不应该在性能方面扼杀你传递一个整个对象(除非您的对象非常大,并且您只需要它的 2 个属性)。

    【讨论】:

    • 我正在学习 WPF,当我绑定单个属性并使用 IValueConverter 时,有时我需要来自同一对象的其他属性,例如相比。所以我想知道我是否可以到达那些......
    猜你喜欢
    • 2014-02-04
    • 1970-01-01
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    • 2021-10-18
    • 2022-11-08
    • 2016-03-24
    相关资源
    最近更新 更多