2012-09-02 26 views
71

Ben varsa:Nesne gerçek türüne nasıl dökülür?

void MyMethod(Object obj) { ... } 

nasıl gerçek türüdür ne obj yayınlayabilirsiniz? Gerçek türüne çevrim

+2

Derleme zamanında bilinen türden mi? – psubsee2003

+1

Ve bundan ne elde etmeyi bekliyorsunuz? Lütfen ne elde etmeyi beklediğinizden ziyade, neyi başarmaya çalıştığınızı bize bildirin. –

+0

@JonSkeet: Nesneden bir işlevi çağırmak istiyorum. Şu anda 'object.MyFunction(); ', gerçek nesnenin bu işleve sahip olduğunu bilmeme rağmen derlemiyor. –

cevap

117

sonra sadece fiili türünü biliyorsanız:

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

gerçek tipini bilmiyorsanız, o zaman: gerçekten, yok hayır.

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

Swift'deki eşdeğer sözdizimi nedir? – Rao

+1

Nevermind, typecasting için '' 'olarak bulundu ve tür (of: ClassName)' türünü kontrol etmek için tip türü. – Rao

0

kolaydır:

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

Bu çok komik ... – Steve

+1

Bu mantıksız. Aslında gerçek tipi bilmiyorsun. Bunu nasıl yapmalısın? –

28

sanmıyorum:

  • yansıması
  • uygulayan Örneğin

  • dinamik tanınmış arayüzü: yerine birini kullanmak zorunda kalacak (yansıma olmadan), işlevinize de bir tür vermelisiniz:

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

    UPD: Bu sizin için işe yarayabilir

    : En MyFunction() yöntem bir sınıfın (ve onun soyundan) sadece tanımlanırsa

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

    Bu gerçekten işe yaramaz bir cevaptır, oy kullanma hakkından mahrumdur. Nesne nesnesinin bir nesnenin yansıması, OP tarafından sorulduğu gibi, nesnenin "gerçek türünü" üretmeyecektir. Ayrıca, MyMethod mantığınız kusurludur çünkü obj A tipinde olabilir ve aynı zamanda B tipi de olabilir. Mantığınız "gerçek tip" (OP talep edildiği gibi) sağlamaz - uyumlu bir tip sağlar ve zorunlu olarak değil İstenen tipte. – Jazimov

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

    , denemek

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

    Eğer aramak istediğiniz işlevi tanımlayan ilgisiz sınıflarında çok sayıda, bir arayüze tanımlayabilir ve sınıfları bu arayüz tanımlamak yapmalıdır var: Örneğin gerçek türüne

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

    Cast bunu şimdi eğer türünü o abc isimli sınıftan yönlendirilmiştir. Bu şekilde işlevini çağırabilirsiniz:

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

    bunu farklı bir şekilde yapılabilir işlevini bilmiyorsanız. Her zaman kolay değil. Ama bunu bir şekilde imzasıyla bulabilirsiniz. Durum buysa, bize bildirmelisiniz.

    0

    Benim durumumda AutoMapper iyi çalışıyor.

    AutoMapper dinamik nesnelerden herhangi açık yapılandırmaya olmadan/bağlanabilirler:

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

    Benzer şekilde AutoMapper özellik isimlerinin anahtarları sıraya olacak, nesnelere sözlüklerden düz eşleştirebilirsiniz.

    more info https://github.com/AutoMapper/AutoMapper/wiki/Dynamic-and-ExpandoObject-Mapping

    İlgili konular