2012-05-03 81 views
1

我有這樣的結構域:C#思考:如何使用 「對象」 作爲 「類型參數」

public class GenClass<T> { } 

public class Type1 { } 

public class Type2 { } 

public class GenType1 : GenClass<Type1> { } 

public class GenType2 : GenClass<Type1> { } 

public class GenType3 : GenClass<Type2> { } 

public class GenType4 : GenClass<string> { } 

public class GenType5 : GenClass<int> { } 

和這個邏輯:

public class SomeClass { 
    public void Add<T>(GenClass<T> t) { } 
} 

和這種消費:

public class Consumer { 
    public void Method() { 
     var some = new SomeClass(); 
     some.Add(new GenType1()); 
     some.Add(new GenType2()); 
     some.Add(new GenType3()); 
     some.Add(new GenType4()); 
     some.Add(new GenType5()); 
    } 
} 

但不是單獨添加每個GenType(n),而是創建一個像這樣的方法:

public void AddFromAssembly<TAssembly>(SomeClass some, Type baseType) { 
    var list = typeof(TAssembly).Assembly.GetTypes() 
     .Where(t => baseType.IsAssignableFrom(t) 
      && !baseType.Equals(t)) 
     .ToList(); 
    list.ForEach(type => { 
     var ctor = type.GetConstructor(BindingFlags.Instance | BindingFlags.Public, null, 
             Type.EmptyTypes, null); 
     var obj = ctor.Invoke(new object[] { }); 
     some.Add(obj); //???? 
    }); 
} 

,並希望這樣稱呼它:

public class Consumer { 
    public void Method() { 
     var some = new SomeClass(); 
     AddFromAssembly<GenType1>(some, typeof(GenClass<>)); 
    } 
} 

some.Add方法是一種通用的方法和ctor.Invoke方法返回一個object。 你有什麼想法來解決這個問題嗎?提前致謝。

UPDATE問題不完整,我解決了。感謝您的審查。

+0

「obj」的「類型」應該是什麼? (雖然不是一個聰明的答案,但我經常有一個'void X(object x,Type t)',它從'void X (T t){X(t,typeof(T));}' ) – 2012-05-03 18:07:41

+0

問題不完整,我解決了。感謝您的審查。 –

回答

1

對泛型的參數類型是需要的編譯時間,不能在運行時確定(除非您想要在運行時創建類定義的麻煩)。

你可能需要做的是創建第二個版本的方法,鍵入「對象」,並用它來代替。

7

要麼做到這一點:

Add<object>(obj); //this will work with T typed as object 

或:

typeof(Some).GetMethod("Add").MakeGenericMethod(new [] { typeof(obj.GetType()).Invoke(some, new [] { obj }); 

反射版本將使用obj的確切類型對於T在運行時。

+0

問題不完整,我解決了。感謝您的審查。 –

相關問題