0

以下のコードは、 にオブジェクトを追加しますMemoryCache。これらのオブジェクトは異なるタイプを持つことができます。

オブジェクトを返すことができるメソッドが欲しいのですMemoryCacheが、戻り値の型は異なる場合があります。

私のサンプルでは 2 ですが、それ以上になることもあります。私のサンプルでは、​​戻り値の型はIT1orList<IT2>

このメソッドを実装するにはどうすればよいですか?

このようなメソッドが欲しいです(返されるタイプはキーによって異なる場合があります):

public ??? GetObjectFromKey(string key)
{
    return _cache.Get(key);
}

ありがとう、

MemoryCache _cache = MemoryCache.Default;

var it1 = new T1 { Name = "My" };
var it2 = new List<IT2>().Add(new T2 { Age = 5 });

_cache.Add("ITC1", it1, new CacheItemPolicy());
_cache.Add("ITC2", it2, new CacheItemPolicy());

var typeName = _cache.Get("ITC1").GetType();

public interface IT1
{
    string Name { get; set; }
}

public class T1 : IT1
{
    public string Name { get; set; }
}

public class T2 : IT2
{
    public int Age { get; set; }
}

public interface IT2
{
    int Age { get; set; }
}
4

3 に答える 3

1

キャッシュの戻り値の型は、 または のいずれかであるobject必要がありますdynamic。キャッシュに入れるクラスには共通点がないため、他に可能性はありません。

于 2013-06-06T09:06:01.013 に答える
0

GetObjectFromKey を呼び出すときに型がわかっている場合は、ジェネリックを使用できます。

public T GetObjectFromKey(string key)
{
    object returnObj = _cache.Get(key);
    if(returnObj.GetType() == typeof(T)) // may need to also check for inheritance
    {
         return (T) returnObj;
    }
    else
    {
         throw new Expcetion("InvalidType");
    }
}

次に、それを呼び出すと:

IT1 myObj = GetObjectFromKey<IT1>("mykey");

約束どおり、実行時に任意の型からジェネリック メソッドを構築する方法を次に示します (ただし、これがどのように役立つかはわかりません!)。

Type t = typeof(Something); // your type at run time
Type cacheType = _cache.GetType(); // The type that has the GetObjectFromKeyMethod

MethodInfo lGenericMethod = cacheType.GetMethod("GetObjectFromKey");
MethodInfo lTypedMethod = lMethod.MakeGenericMethod(t);

dynamic lReturn = lTypedMethod.Invoke(_cache, new object[] { "mykey" } );

ただし、コンパイル時に型がわからないため、何もできないことは明らかですがlReturn、オブジェクト(または一般的なインターフェイス)を返してそれを呼び出すことができますGetType。それでも、そのような楽しいリフレクション メソッドを書くのは楽しいです :P

于 2013-06-06T09:16:27.770 に答える
0

ジェネリック?

public T GetObjectFromKey<T>(string key)
{
    return (T)_cache.Get(key);
}
于 2013-06-06T09:18:54.173 に答える