Pertanyaan Bagaimana cara mentransmisikan Object ke tipe sebenarnya?


Jika saya punya:

void MyMethod(Object obj) {   ...   }

Bagaimana saya bisa mentransmisi obj untuk jenis sebenarnya apa itu?


76
2017-09-02 07:18


asal


Jawaban:


Jika Anda tahu tipe sebenarnya, maka hanya:

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

Jika Anda tidak tahu tipe sebenarnya, maka: tidak benar-benar, tidak. Anda harus menggunakan salah satu dari:

  • refleksi
  • mengimplementasikan antarmuka yang terkenal
  • dinamis

Sebagai contoh:

// 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



Saya tidak berpikir Anda dapat (bukan tanpa refleksi), Anda harus memberikan tipe untuk fungsi Anda juga:

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

UPD:

Ini dapat bekerja untuk Anda:

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



Mentransmisi ke tipe sebenarnya mudah:

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

2
2017-09-02 07:22



Jika Anda MyFunction() metode didefinisikan hanya dalam satu kelas (dan turunannya), coba

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

Jika Anda memiliki jumlah besar di kelas yang tidak berhubungan mendefinisikan fungsi yang ingin Anda panggil, Anda harus mendefinisikan antarmuka dan membuat kelas Anda menentukan antarmuka itu:

interface IMyInterface
{
    void MyFunction();
}

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

0
2017-09-02 07:31



Transmisikan ke jenis aslinya jika Anda sekarang tipe misalnya itu berorientasi dari kelas bernama abc. Anda dapat memanggil fungsi Anda dengan cara ini:

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

jika Anda tidak tahu fungsi itu dapat dilakukan dengan cara yang berbeda. Tidak selalu mudah. Tetapi Anda dapat menemukannya dengan cara tertentu dengan tanda tangan itu. Jika ini kasus Anda, Anda harus memberi tahu kami.


0
2017-09-02 08:11



Dalam kasus saya, AutoMapper bekerja dengan baik.

AutoMapper dapat memetakan ke / dari objek dinamis tanpa konfigurasi eksplisit apa pun:

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

Demikian pula Anda dapat memetakan langsung dari kamus ke objek, AutoMapper akan berbaris kunci dengan nama properti.

Info lebih lanjut 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