3

オブジェクトをアップキャストするための可能なタイプを取得する方法を探しています。例: Control を継承する MyControl タイプのコントロールがあります。ここで、タイプ MyControl のオブジェクトが Control にダウンキャストされたときに、それが最上位のオブジェクト タイプであるかどうか、またはアップキャストできるタイプ (この場合は MyControl) をいつ取得するかを調べる方法があります。 ? MyControl (リフレクション付き) にアップキャストし、リフレクション付きのプロパティを取得します。しかし、私はこれをしなければならない場所で MyControl を知りません。

MyControl は、Visible を new で実装しています。control.Visible = true を呼び出すと、Control の Visible が呼び出されますが、MyControl の Visible を呼び出す必要があります。

ご協力いただきありがとうございます。

4

3 に答える 3

4

これを使用することもできます:

MyControl myControl = someControlOfTypeMyControl as MyControl

if(myControl != null)
{
   //your stuff
}

「as」を使用すると、.net フレームワークは、コントロールがその型からのものであるかどうかをチェックし、キャストできる場合、.NET Framework は MyControl 型でキャストして返します。それ以外の場合は、null を返します。

したがって、基本的には以前の回答と同じですが、よりクリーンです(私見、違うと考えることができます)

于 2012-02-07T11:09:29.633 に答える
2

がある:

if (myControl is MyControl)
{
    var m = (MyControl)myControl;
}

これは、型階層のどの部分でも機能します。変数自体が基本型の場合、次のチェックは機能しません。

MyBaseControl myControl = null;

if (myControl.GetType() == typeof(MyControl))
{

}

ただし、オーバーライドされたメソッドまたはプロパティの動作が必要なようです。通常の状況では、オーバーライドしますVisible:

public override bool Visible
{
    get { return true; } // Always visible in derived class.
}

ただし、これは、基本クラスがシールされておらず、オーバーライドするメンバーがabstractまたはである場合のみvirtualです。そうでない場合は、派生型へのキャストに固執します...理想的ではありませんが、多くのオプションはありません。

次のように基本メンバーを非表示にしようとしたようにも聞こえます。

public new bool Visible
{
    get { return true; }
}

これは、型自体への参照がある場合にのみ機能します。基本型への参照がある場合、メンバーの非表示は機能せ、メンバーが派生型で非表示になっていることを知りません。

MyBaseControl c = new MyDerivedControl();

bool vis = c.Visible; // Comes from MyBaseControl even if hidden in derived control.

(上記でVisibleは、オーバーライドされた場合、派生クラスから取得されます)。

更新:実行時にこれを行うには、反映したいものの名前を知っている限り、次のことを行うことができます:

class Program
    {
        static void Main(string[] args)
        {
            A a = new B();

            // Get the casted object.
            string fullName = a.GetType().FullName;
            object castedObject = Convert.ChangeType(a, Type.GetType(fullName));

            // Use reflection to get the type.
            var pi = castedObject.GetType().GetProperty("Visible");

            Console.WriteLine(a.Visible);
            Console.WriteLine((bool)pi.GetValue(castedObject, null));

            Console.Read();
        }
    }    

    class A
    {
        public bool Visible { get { return false; } }
    }

    class B : A
    {
        public new bool Visible { get { return true; } }
    }
}
于 2012-02-07T11:04:17.437 に答える
0
Control control = (control)someControlOfTypeMyControl;

if (control is MyControl) {
    var myControl = (MyControl)control;
    var propertyValue = myControl.SomeProperty;
}
于 2012-02-07T11:04:16.890 に答える