2012-11-02 37 views
0

我想用一個動態參數創建對象的實例,就像C#私人牛逼的CreateObject <T>()

private Type ClassType { get; set; } 
model = (CreateObject<typeof(this.ClassType)>)ser.Deserialize(sr); 


private T CreateObject<T>() 
{ 
    return (T)Activator.CreateInstance(this.ClassType); 
} 

我想嘗試它沒有像「startconfig」修復類型。 但它仍然無法正常工作,你能幫助我嗎?

 var mi = GetType().GetMethod("CreateObject"); 
     var miConstructed = mi.MakeGenericMethod(this.ClassType); 
     var instance = miConstructed.Invoke(this, null); 
     var model = (instance)ser.Deserialize(sr); 
    } 

    private T CreateObject<T>() 
    { 
     return (T)Activator.CreateInstance(this.ClassType); 
    } 

這並不工作,無論如何,原因:他類型或命名空間名稱「類型/命名空間」找不到(是否缺少using指令或程序集引用?)

是happends在鑄造ser.Deserialize(SR);

+2

以什麼方式不起作用:你會得到一個異常(在這種情況下:什麼異常和消息>?)或其他? – Richard

+1

這是什麼「ClassType」屬性? – logicnp

+0

我得到了編譯錯誤: http://msdn.microsoft.com/en-us/library/hxfhx4sy(v=vs.90).aspx – Ipad

回答

2

你想創建一個T的實例嗎?然後:

var model = CreateObject<StartConfig>();  

private T CreateObject<T>() 
{ 
    return (T)Activator.CreateInstance(typeof(T)); 
} 

與你的第二個代碼示例,你可能會這樣做。

private Type ClassType { get; set; } 
var mi = GetType().GetMethod("CreateObject"); 
var miConstructed = mi.MakeGenericMethod(ClassType); 
var instance = miConstructed.Invoke(this, null); 
model = (instance)ser.Deserialize(sr); 

private T CreateObject<T>() 
{ 
    return (T)Activator.CreateInstance(typeof(T)); 
} 
+0

那麼你爲什麼使用泛型?這就是使用'Activator.CreateInstance'的全部意義......如果您事先知道類型(如果您使用泛型,您必須知道),那麼您可以使用ctor。 –

+0

@ user1793913可能會看到編輯...但你應該顯示更多的代碼,因爲它看起來像是,你的架構有一些問題... –

+0

只是爲了記錄:我的評論是關於OP評論和刪除之後。 –

0

的Try ...

public class Factory<T> 
{ 
    public static T getInstance() 
    { 
     return getInstance(typeof(T), null); 
    } 

    public static T getInstance(object[] initializationParameters) 
    { 
     return (T)Activator.CreateInstance(typeof(T), initializationParameters); 
    } 
{ 
0

你要什麼你model辦?我的意思是界面明智的。您必須定義一個所有類型遵守您反序列化的接口。

public interface IModel 
{ 
    int ComputeFavoriteNumber(); // or a property 
} 

... 

// class is practically unknown to deserializing module 
internal class ErnieModel : IModel 
{ 
    public int ComputeFavoriteNumber() 
    { 
     return 8243721; 
    } 
} 

... 

// deserializing module 
var bf = new BinaryFormatter(); 
using (var ms = new MemoryStream()) 
{ 
    bf.Serialize(ms, new ErnieModel()); // In reality ErnieModel should be unknown to the deserializing code, this is just to fill the Stream with data 
    ms.Position = 0; 
    var model = (IModel)bf.Deserialize(sr); 
    Console.WriteLine("Favorite number: {0}", model.ComputeFavoriteNumber()); 
} 

在這種情況下,您甚至不需要Activator.CreateInstance。但是,如果您只是保存了要創建的類型的完全限定名稱或類型本身(不確定是否可行),則確實需要它。

// interfaces/classes the same as above 
Type deserializedType = typeof(ErnieModel); // or get it from wherever, maybe through (Type)bf.Deserialize(stream); ? In reality ErnieModel should be unknown to the deserializing code 
var model = (IModel)Activator.CreateInstance(deserializedType); 
Console.WriteLine("Favorite number: {0}", model.ComputeFavoriteNumber()); 

使用泛型沒有意義在此情況下(雖然感覺就像一個好地方,在第一個報名),你必須去與老校友object和鑄造到一個已知的接口類型,以實現真正的plugin-像擴展。