Frage Wie man Objekt auf seinen tatsächlichen Typ wirft?


Wenn ich habe:

void MyMethod(Object obj) {   ...   }

Wie kann ich casten? obj zu was ist sein eigentlicher Typ?


76
2017-09-02 07:18


Ursprung


Antworten:


Wenn Sie den tatsächlichen Typ kennen, dann nur:

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

Wenn Sie den tatsächlichen Typ nicht kennen, dann: nicht wirklich, nein. Sie müssten stattdessen einen der folgenden verwenden:

  • Betrachtung
  • Implementierung einer bekannten Schnittstelle
  • dynamisch

Beispielsweise:

// 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();

132
2017-09-02 07:22



Ich glaube nicht, dass du (nicht ohne Reflektion) auch deiner Funktion einen Typ geben kannst:

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

UPD:

Dies kann für Sie funktionieren:

void MyMethod(Object obj)
{
    if (obj is A)
    {
        A a = obj as A;
        ...
    } 
    else if (obj is B)
    {
        B b = obj as B;
        ...
    }
}

29
2017-09-02 07:25



Casting zum tatsächlichen Typ ist einfach:

void MyMethod(Object obj) {
    ActualType actualyType = (ActualType)obj;
}

2
2017-09-02 07:22



Wenn dein MyFunction() Methode ist nur in einer Klasse (und ihren Nachkommen) definiert, versuchen

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

Wenn Sie eine große Anzahl nicht verwandter Klassen haben, die die Funktion definieren, die Sie aufrufen möchten, sollten Sie eine Schnittstelle definieren und Ihre Klassen diese Schnittstelle definieren lassen:

interface IMyInterface
{
    void MyFunction();
}

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

0
2017-09-02 07:31



Wirf es auf seinen realen Typ um, wenn du nun den Typ zum Beispiel aus der Klasse abc ableitet. Sie können Ihre Funktion auf diese Weise aufrufen:

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

Wenn Sie die Funktion nicht kennen, können Sie dies auf andere Weise tun. Nicht immer einfach. Aber Sie können es in irgendeiner Weise durch seine Unterschrift finden. Wenn dies der Fall ist, sollten Sie uns Bescheid geben.


0
2017-09-02 08:11



In meinem Fall funktioniert AutoMapper gut.

AutoMapper kann zu / von dynamischen Objekten ohne explizite Konfiguration abbilden:

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);

Ähnlich können Sie direkt von Wörterbüchern zu Objekten zuordnen, AutoMapper wird die Schlüssel mit Eigenschaftsnamen aufstellen.

Mehr Info https://github.com/AutoMapper/AutoMapper/wiki/Dynamic-and-ExpandoObject-Mapping


0
2018-05-10 06:37



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

-1
2017-09-02 07:26