3

ISomething として渡されるオブジェクトがあります。オブジェクトをシリアル化する必要がありますが、シリアライザーは具象型の型パラメーターを期待しています。

string xml = Utilities.Serialize<ConcreteType>(myObject);

基本的に、私はこの男と同じことをしたい: Type 変数に基づいて汎用オブジェクトを作成する

ただし、結果の型をジェネリック クラスのパラメーターとして使用したいオブジェクトの新しいインスタンスを作成したくありません。

一言で言えば、私の質問は、次のようなジェネリック クラスで使用できるオブジェクトの具象型を表す変数を作成する方法です。

string xml = Utilities.Serialize<ConcreteType>(myObject);

ここで、作成する必要があるのは ConcreteType です。

4

4 に答える 4

3

だから、あなたが次のようなものを持っているとしましょう:

public static class Util
{
    public static T Foo<T>(object obj)
    {
         // Do actual stuff here
         return default(T);
    }
}

通常、コンパイラはこのメソッドの使用法を接続し、渡されたものに基づいて適切な汎用バリアントを交換します。Typeを含む変数がある場合、コンパイラに依存することはできなくなりましたが、クラスに必要なバリアントを提供するように依頼できます。

public void DoFooWith(object blob)
{
    // Get the containing class
    var utilType = typeof(Util);
    // Get the method we want to invoke
    var baseMethod = utilType.GetMethod("Foo", new Type[]{typeof(object)});
    // Get a "type-specific" variant
    var typedForBlob = baseMethod.MakeGenericMethod(blob.GetType());
    // And invoke it
    var res = typedForBlob.Invoke(null, new[]{blob});
}
于 2012-10-02T02:45:53.407 に答える
0

実際のオブジェクトの型を絶対に取得する必要がある場合は、GetType() を使用できます。問題は、リフレクションを使用してすべての関数を呼び出す必要があることです。これは、私が知る限り、型の変数で関数を呼び出す簡単な方法がないためです。

于 2012-10-01T22:05:42.597 に答える
0

ISomethingすべてがであることを保証することはできませんが、ConcreteTypeそれらをキャストして機能するものを渡すことはできます。

string CastAndSerialize(ISomething somthing)
{
    //castSomthing will be null if ISomthing was not a ConcreteType.    
    ConcreteType castSomthing = somthing as ConcreteType; 

    if(castSomthing != null)
    {
       return Utilities.Serialize<ConcreteType>(castSomthing );
    }
    else
    {
        return null; //Or whatever you want to use to represent that the cast failed.
    }
}

これはより一般的なバージョンです。これはclass.

string CastAndSerialize<T>(ISomething somthing) where T : class
{ 
    T castSomthing = somthing as T; 

    if(castSomthing != null)
    {
       return Utilities.Serialize<T>(castSomthing );
    }
    else
    {
        return null;
    }
}
于 2012-10-01T22:16:07.550 に答える
-2

ジェネリック メソッドの別の形式のケースである可能性があります。Utilities.Serialize(...) を所有していて、新しいオーバーロードを生成できる場合は、以下をご覧ください。

http://msdn.microsoft.com/en-US/library/twcad0zb(v=VS.80).aspx

例えば:

string Utilities.Serialize<T>(T object) 
    where T : ConcreteType

さらに熟考すると(しゃれが意図されています)、次のものがあなたが探しているものである可能性がありますか?

動的型でジェネリック メソッドを呼び出す

于 2012-10-01T22:03:16.280 に答える