【问题标题】:How to get which Type of parent object to reference the current object via property如何通过属性获取哪个类型的父对象引用当前对象
【发布时间】:2012-09-24 16:28:15
【问题描述】:

假设我有三个类ABC,如下所示,AB 具有属性Pro1Pro2,类型为C

class A
{
    public C Pro1 {get; set; }
}

class B
{
    public C Pro2 { get; set; }
}

public class C
{
    public void Do()
    {
        //How to get Type of object to reference to current object C
        //Example: Either type A or B
    }
}

C 类的方法Do 中,我想获取当前对象C 引用的当前父对象(通过Pro1Pro2)。在此示例中为 A 或 B,但一般来说,它可能是非常动态的:

var a = new A() { Pro1 = new C() };
a.Pro1.Do(); //will get Type A in Do

var b = new B() { Pro2 = new C() };
b.Pro2.Do(); //with get Type B in Do

我可以通过哪种方法实现这一目标?

【问题讨论】:

  • 你在Do做什么?实现这种行为有更简洁的方法(例如AB 实现一个通用接口并传递它们),而不是对类型做出反应,这很快就会变得丑陋。
  • @AustinSalonen:我试图从这个问题中弄清楚并引导我到这一点:stackoverflow.com/questions/12552646/…
  • 与导致这个问题的原始问题一样,如果不对类进行一些重新定义,就没有直接的方法来完成所要求的事情。也许添加泛型类型参数,也许添加某种接口,什么的。如果您保留问题中所写的类,则 C 的实例无法知道它是从 A.Pro1 还是 B.Pro2 获得的。例如,这两个属性返回的对象甚至可能是完全相同的对象!
  • 我在您链接的 Mattias 的问题中添加了一个新建议。希望这能让他走上正轨。

标签: c# .net


【解决方案1】:

您可以将“父”对象作为参数传递给 C 构造函数:

public class C
{
    private readonly object _parent;
    public C(object parent)
    {
        _parent;
    }

    public void Do()
    {
        Type type = _parent != null ? _parent.GetType() : null;
        // Do something with type...
    }
}

【讨论】:

    【解决方案2】:
    var a = new A() { Pro1 = new C() };
    a.Pro1.Do(); //will get Type A in Do
    
    var b = new B() { Pro2 = new C() };
    b.Pro2.Do(); //with get Type B in Do
    

    由此,您已经知道是哪个对象在进行调用(a 或 b);那么你正在做的事情可能没有意义。如果是这样,您总是可以通过简单的继承来解决这个问题

    C a=new A();
    C b=new B();
    

    并且可以在角色 A 或 B 中插入调用者的身份。

    【讨论】:

      【解决方案3】:

      Thomas Levesque 提供了一种向C 添加更多信息的方法来实现这一目标。如果它是您想要存储在C 中的类型而不是特定实例,您可以将C 设为通用,如下所示:

      class A
      {
        public C<A> Pro1 { get; set; }
      }
      
      class B
      {
        public C<B> Pro2 { get; set; }
      }
      
      public class C<T> where T : class   // maybe you want to add other "where" constraints on T
      {
        public void Do()
        {
          // you can use T in here
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-14
        • 2022-11-10
        • 1970-01-01
        • 2017-01-25
        • 1970-01-01
        • 2011-11-02
        • 1970-01-01
        • 2014-02-04
        相关资源
        最近更新 更多