2009-06-09 16 views
5

Çalışma zamanına kadar ne tür bir döküm yapılacağını bilmeden genel bir sınıf örneği oluşturmaya çalışıyorum. Ben ancak alışkanlık sadeceC# Generics

diyor derlemek, seni benim çalıştığım şey bir fikir verir Aşağıdaki kodu

 Type pType = propertyInfo.GetType(); 
     ObjectComparer<pType> oc = new ObjectComparer<pType>(); 

Umarım yazdım "tipi veya ad alanı pType bulunamadı" .

Bunu yapmanın kolay bir yolu var mı? olmayan bir genel arabirimi (IComparer, belki) için döküm sürece

Teşekkür

Gavin

cevap

10
Type type = typeof(ObjectComparer<>).MakeGenericType(pType); 
object obj = Activator.CreateInstance(type); 

Ancak, bir genel tür olarak bunu kullanma hakkını kaybedebilir.

interface ISomeInterface { 
    object SomeMethod(object value); 
} 
interface ISomeInterface<T> : ISomeInterface { 
    T SomeMethod(T value); 
} 

Ardından olmayan jenerik ISomeInterface aracılığıyla çağırabileceği herhangi bir ekstra çemberler üzerinden atlamak zorunda kalmadan:


burada en yaygın cevap

olmayan bir jenerik taban sınıfı/arayüzüdür.

aşağıda MakeGenericMethod kullanarak Örnek - ama olur daha verimli olmayan bir jenerik baz arayüzü: Böyle

class Program { 
    static void Main() { 
     int i = 123; 
     typeof(Program).GetMethod("Foo", 
       BindingFlags.Static | BindingFlags.NonPublic) 
      .MakeGenericMethod(i.GetType()) 
      .Invoke(null, new object[] { i }); 
    } 
    static void Foo<T>(T value) { 
     ObjectComparer<T> comparer = new ObjectComparer<T>(); 
     comparer.Bar(value); 
    } 
} 
class ObjectComparer<T> { 
    public void Bar(T value) { 
     Console.WriteLine(typeof(T).Name + " = " + value); 
    } 
} 
+0

Bu kodun bir nesne olarak sınıfın bir örneğini aldığını düşünerek haklı mıyım? Eğer öyleyse, o zaman nasıl sınıfın türüne çeviririm? Teşekkürler – Gavin

+0

Yapamazsınız (anlaşmalı) - bu yüzden belki de jenerik olmayan bir türe dökülme hakkındaki yorumum (belki de yöntemlerinizi buraya koyun?). Belki bir jenerik ** metodunu ** arayabilir ve oradaki işi yapabilirdiniz? (Bir örnek ekleyeceğim). –

1

şey:

Type someType = typeof(ObjectComparer<>); 
Type toConstruct = someType.MakeGenericType (pType); 

object o = Activator.CreateInstance (toConstruct); 

i yavaş olduğumu görünüyor.

İlgili konular