0

編集:これが役に立てば幸いです。私がやろうとしていることを理解してください。

Object 型のオブジェクトが返されました。このオブジェクト内に int 値があり、この int 値に基づいて、列挙型を使用して、このオブジェクトをどの特定のオブジェクトにケースする必要があるかを伝えたいと考えています。

Enum は可能なすべてのケーシングを保持します。

私は(オブジェクト型の)汎用オブジェクトを受け取ります。これは、このモデル型の場合のように、より具体的な多くのオブジェクトの1つになる可能性があります。どのキャストを使用するかを教えてくれる int 値のオブジェクトの内部を調べられるようにしたいと考えています。

たとえば、objectA があり、オブジェクト内で int 値が '2' に設定されている場合、特定の型に設定されている列挙値 2 に基づいて、このオブジェクトを特定のオブジェクトにキャストしたいと考えています。

これは非常に単純かもしれませんが、どうすればよいかわかりません。可能であれば、ありがとうございます。

ありがとう。

4

3 に答える 3

2

ある列挙型を別の列挙型に型キャストしようとしていますか?

    Enum Type1
    {
      A
      B
    };

    Enum Type2
    {
      A,
      B
    };

    Type1 type1 = Type1.A;
    if(Enum.IsDefined(typeof(Type2), type1.A.ToString())
    {
       Type2 type2 = (Type2)Enum.Parse(typeof(Type2), type1.A.ToString());
       //type2 now holds Type2.A
    }

編集

実行時にオブジェクトのタイプを変更したい場合、それは不可能です。

キャストだけを意味する場合 (実装されたインターフェイス、基本クラスなどに対応する同じオブジェクトの異なる表現) は可能ですが、ここではオブジェクトの型は変わりません。

于 2012-05-17T09:12:27.093 に答える
2

実行時にobjectA 変数の型を変更したいということであれば、答えはノーです。コンパイラは、コンパイル時に行われるすべての種類の変数の型を知る必要があります。

C# 4 を使用している場合は、 を使用dynamicして支援できる場合がありますが、何を達成しようとしているのかは明確ではありません。多くの場合、すべての型が実装する共通のインターフェイスを作成し、変数の型をインターフェイス型にすることをお勧めします。これは普遍的に適用できるわけではありませんが、機能する場合は良い考えです。

于 2012-05-17T09:10:02.433 に答える
1

あなたが何を望んでいるのかを理解するのは少し難しいです。しかし、これは私の見解です。ITypeContainer列挙値を抽出できるようにするには、すべてのクラスでインターフェイスを実装する必要があります。

void Main()
{
    ....
    ....
    CastToType((ITypeContainer)myObject);
}

public void CastToType(ITypeContainer obj)
{
    switch (obj.ObjectType)
    {
        case TypeEnum.Test1:
            var o1 = (Test1)obj;
            break;
        case TypeEnum.Test2:
            var o2 = (Test2)obj;
            break;
    }
}

public class Test1 : ITypeContainer
{
    public TypeEnum ObjectType{ get; set; }  
}

public class Test2 : ITypeContainer
{
    public TypeEnum ObjectType{ get; set; }  
}

public enum TypeEnum
{
    Test1,
    Test2,
    Test3
}

public interface ITypeContainer
{
    TypeEnum ObjectType{ get; set; }  
}
于 2012-05-17T09:36:39.550 に答える