簡體   English   中英

C#private T CreateObject <T> ()

[英]C# private T 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);
    }

這無論如何都不起作用,原因:無法找到類型或命名空間名稱'type / namespace'(你是否缺少using指令或程序集引用?)

在鑄造ser.Deserialize(sr)時發生的事情;

你想創建一個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));
}

嘗試...

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

你想對你的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());

在這種情況下使用泛型是沒有意義的(雖然它首先感覺是一個好地方),你必須使用oldschool object並轉換為已知的接口類型以啟用真正的插件式擴展。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM