0

のような動的パラメータを持つオブジェクトのインスタンスを作成したい

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); のキャスト時に発生します。

4

3 に答える 3

2

T のインスタンスを作成しますか? それで :

var model = CreateObject<StartConfig>();    

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

2 番目のコード サンプルでは、​​そのようなことを行うことができます。

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));
}
于 2012-11-02T10:36:14.270 に答える
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。真のプラグインのような拡張機能を有効にするには、オールドスクールを使用して既知のインターフェイス タイプにキャストする必要があります。

于 2012-11-02T10:55:02.473 に答える
0

試す...

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);
    }
{
于 2012-11-02T10:41:14.953 に答える