141

私が持っている場合:

void MyMethod(Object obj) {   ...   }

obj実際のタイプにキャストするにはどうすればよいですか?

4

9 に答える 9

221

実際のタイプがわかっている場合は、次のようにします。

SomeType typed = (SomeType)obj;
typed.MyFunction();

実際のタイプがわからない場合は、実際にはそうではありません。代わりに、次のいずれかを使用する必要があります。

  • 反射
  • よく知られたインターフェースの実装
  • 動的

例えば:

// reflection
obj.GetType().GetMethod("MyFunction").Invoke(obj, null);

// interface
IFoo foo = (IFoo)obj; // where SomeType : IFoo and IFoo declares MyFunction
foo.MyFunction();

// dynamic
dynamic d = obj;
d.MyFunction();
于 2012-09-02T07:22:54.030 に答える
46

私はあなたが(反射なしではなく)できるとは思いません、あなたはあなたの関数にもタイプを提供するべきです:

void MyMethod(Object obj, Type t)
{
    var convertedObject = Convert.ChangeType(obj, t);
    ...
}

UPD

これはあなたのために働くかもしれません:

void MyMethod(Object obj)
{
    if (obj is A)
    {
        A a = obj as A;
        ...
    } 
    else if (obj is B)
    {
        B b = obj as B;
        ...
    }
}
于 2012-09-02T07:25:20.173 に答える
4

どうですか

JsonConvert.DeserializeObject<SomeType>(object.ToString());
于 2019-11-11T10:41:43.667 に答える
1

MyFunction()メソッドが1つのクラス(およびその子孫)でのみ定義されている場合は、

void MyMethod(Object obj) 
{
    var o = obj as MyClass;
    if (o != null)
        o.MyFunction();
}

呼び出したい関数を定義する無関係なクラスが多数ある場合は、インターフェースを定義し、クラスにそのインターフェースを定義させる必要があります。

interface IMyInterface
{
    void MyFunction();
}

void MyMethod(Object obj) 
{
    var o = obj as IMyInterface;
    if (o != null)
        o.MyFunction();
}
于 2012-09-02T07:31:12.680 に答える
1

私の場合、AutoMapperはうまく機能します。

AutoMapperは、明示的な構成なしで動的オブジェクトに/からマップできます。

public class Foo {
    public int Bar { get; set; }
    public int Baz { get; set; }
}
dynamic foo = new MyDynamicObject();
foo.Bar = 5;
foo.Baz = 6;

Mapper.Initialize(cfg => {});

var result = Mapper.Map<Foo>(foo);
result.Bar.ShouldEqual(5);
result.Baz.ShouldEqual(6);

dynamic foo2 = Mapper.Map<MyDynamicObject>(result);
foo2.Bar.ShouldEqual(5);
foo2.Baz.ShouldEqual(6);

同様に、辞書からオブジェクトに直接マッピングできます。AutoMapperは、キーをプロパティ名と並べます。

詳細https://github.com/AutoMapper/AutoMapper/wiki/Dynamic-and-ExpandoObject-Mapping

于 2017-05-10T06:37:46.790 に答える
0

たとえば、abcという名前のクラスからのタイプである場合は、実際のタイプにキャストします。この方法で関数を呼び出すことができます:

(abc)(obj)).MyFunction();

機能がわからない場合は、別の方法で実行できます。必ずしも簡単ではありません。しかし、あなたはそれの署名によって何らかの方法でそれを見つけることができます。これがあなたの場合であるならば、あなたは私たちに知らせなければなりません。

于 2012-09-02T08:11:50.023 に答える
0

複数のタイプが可能な場合、メソッド自体はキャストするタイプを認識しませんが、呼び出し元は認識します。次のようなものを使用できます。

void TheObliviousHelperMethod<T>(object obj) {
    (T)obj.ThatClassMethodYouWantedToInvoke();
}

// Meanwhile, where the method is called:
TheObliviousHelperMethod<ActualType>(obj);

whereタイプの制限は、括弧の後にキーワードを使用して追加できます。

于 2020-09-04T23:54:52.040 に答える
-2
Implement an interface to call your function in your method
interface IMyInterface
{
 void MyinterfaceMethod();
}

IMyInterface MyObj = obj as IMyInterface;
if ( MyObj != null)
{
MyMethod(IMyInterface MyObj );
}
于 2012-09-02T07:26:54.177 に答える
-5

実際のタイプへのキャストは簡単です。

void MyMethod(Object obj) {
    ActualType actualyType = (ActualType)obj;
}
于 2012-09-02T07:22:46.183 に答える