-2

私が3つのクラスを持っていてAB以下Cのように、プロパティとTypeAを持っているとしましょう:BPro1Pro2C

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
    }
}

DoクラスのメソッドでC、現在のオブジェクト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

これを達成できるアプローチはどれですか?

4

3 に答える 3

2

「親」オブジェクトをパラメーターとして 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...
    }
}
于 2012-09-24T16:32:39.047 に答える
1
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();

また、ctorsAまたはBに発信者のIDを挿入できます。

于 2012-09-24T16:54:22.813 に答える
1

Thomas Levesque は、これを実現するために情報を追加する 1 つの方法を提供して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
  }
}
于 2012-09-24T18:04:01.990 に答える