2012-04-10 18 views
10

için bir C# nesne Unbox için: Böyle bir şey yapmaya çalışıyorum nasıl dinamik tip

void someMethod(TypeA object) { ... } 

void someMethod(TypeB object) { ... } 

object getObject() 
{ 
    if (...) return new TypeA(); 
    else return new TypeB(); 
} 

object obj = getObject(); 
(obj.GetType()) obj; // won't compile 
someMethod(obj); 

Açıkçası ben burada karıştı.

if (obj.GetType() == typeof(TypeA)) obj = (TypeA)obj; 
else if (obj.GetType() == typeof(TypeB)) obj = (TypeB)obj; 

- - Ben sadece bir koşullu deyimi dışarı yazarak bu işi yapabiliriz biliyorum ama zamanında bunu yapmanın bir yolu yok mu?

EDIT Belki de en iyi tasarım tercihi gibi göründüğüne katılıyorum. Yukarıdaki kodun noktası Mongo DB için Repository taban sınıfıdır. Farklı masa çeşitlerini idare edebilmek istiyorum. Bu nedenle, bazı Meet() aslında kaldır; ve TypeA ve TypeB, ObjectID ve Guid; Alttaki kod, dizgeyi bir dize olarak kabul eden yöntemini agnostik türünün bir parçasıdır; ve getObject(), ID parametresini ayrıştırma yöntemidir.

+0

Sen onunla ilişkili zamanı tür bilgi içeren bir tür 't' conflating edilmektedir (struct'lar olan TypeA olmadıkça ve TypeB, yine kutudan çıkarma ... olmayacağını unutmayın) T) '. Onlar aynı şey değiller ve birbirleri için ikame edilemezler. –

+0

Daha iyi tasarım seçenekleri olması muhtemeldir, ancak kodun asıl amacını yayınınızdan çıkarmışsınızdır. Belki de bu kodla ne yapmaya çalıştığınızı bize bildirirseniz, size çözümünüzün çözümü için daha iyi ve tamamen farklı bir yol sunabiliriz. –

+0

@Kirk Woll, Farkı biliyorum, sadece ne yapmaya çalıştığımı göstermek istedim. – McGarnagle

cevap

20

Eğer .NET 4 ve C# 4 kullanıyorsanız, bunun için dynamic kullanabilirsiniz:

dynamic obj = GetObject(); 
SomeMethod(obj); 

Aksi takdirde, bulmak ve doğru yöntemi çağırmak için yansıma kullanmak gerekecek. Aşırı yük çözünürlüğü (dynamic türleri için) - derlemesinde gerçekleştirilir. (`Typeof:

+0

veya 'obj.SomeMethod()'? –

+0

@RobertHarvey: Sorunun yazılı olduğu şekilde değil, aynı türden aşırı yükleri seçiyor. –

+0

Güzel !! Tam olarak aradığım şey, teşekkür ederim. – McGarnagle

İlgili konular