0

たとえば、私はこれを持っています:

class BasePacket
{
   int header;
   int type;
}

class ChildPacket1 : BasePacket
{
   //...
}

class ChildPacket2 : BasePacket
{
   //...
}

BasePacket bp;
Type t;
object obj = CreateNeededChildPacket(out t); //return one of childs as object and it's real type
bp = ...// anyway to cast obj to type represented by t? or by using something else?
4

2 に答える 2

4

Convert.ChangeTypeは、以下を条件として、これを含む幅広い型変換シナリオを非常に効率的に処理できます。

読者は、Convert.ChangeType()が特定の標準の.NETシステムタイプに対してのみ機能することを理解する必要があります。IConvertibleを実装していないコンポーネントでは機能せず、カスタムタイプでは機能しません。

float f = 1.1f;
int i;
Type t = typeof(int);
i = (int)Convert.ChangeType(f, t);
Console.WriteLine(i);

特定の例では、2つの値型間の変換は、オブジェクトとしてボックス化された整数値を返すChangeTypeため、直接キャストほど効率的ではないことに注意してください。ChangeType

実装されている場合は、ChangeType独自のクラスで使用できます。IConvertable

public class MyClass : IConvertible
{
    public float MyFloatValue { get; set; }

    int IConvertible.ToInt32(IFormatProvider provider)
    {
        return (int)MyFloatValue;
    }

    // TODO: Implement the rest of IConvertable
}

MyClass myClass = new MyClass() { MyFloatValue = 42.42f };
i = (int) Convert.ChangeType(myClass, t);
Console.WriteLine(i);
于 2012-06-25T05:45:31.863 に答える
1

あなたの例では、2つの派生クラスの1つを作成し、それを基本変数に格納しています...継承の法則に従ってこれを行うのはまったく問題ないため、これはキャストをまったく必要としません。基本型変数には、より派生したオブジェクトをいつでも割り当てることができます。これは、基本クラスが実行できることはすべて、派生クラスも実行できることが保証されているため、安全です。たとえば、数学の教師は、通常の教師が実行できる任意のアクション(GradePapers()など)を実行できます。Teacher変数を使用してMathTeacherオブジェクトを指定するのが安全です。

BasePacket bp = (BasePacket) CreateNeededChildPacket();

編集: コメントに応じて、理想的には、CreateNeededChildPacket()メソッドがBasePacketタイプを返すようにします(返されたオブジェクトが常にBasePacketから派生している場合)。基本パラメーターが派生オブジェクトを受け入れることができるのと同じように、基本戻り型は派生オブジェクトを返すことができます。これが継承の美しさです。これは、あなたのメソッドを呼び出す将来の誰かにとってはるかに安全です。

BasePacket CreateNeededChildPacket() 
{
    // do something
    return AnyObjectThatDerivesFromBasePacket;    
}

メソッドを更新できない場合は、安全のためにタイプチェックを追加することができます。

object obj = CreateNeededChildPacket();
BasePacket bp = null;

if (obj is BasePacket) 
   bp = (BasePacket) obj;
else
   throw new Exception("Object was not a valid BasePacket type: " + obj.GetType.ToString());
于 2012-06-25T06:27:35.553 に答える