2013-06-06 1 views
0

아래 코드는 MemoryCache에 개체를 추가합니다. 이러한 개체는 다른 유형을 가질 수 있습니다.컬렉션 항목 유형에 따라 값을 반환하는 메서드

MemoryCache에서 개체를 반환 할 수있는 방법을 원하지만 반환 유형이 다를 수 있습니다.

내 샘플에는 2이지만 훨씬 더 많을 수 있습니다. 내 샘플에서 반환 형식은 IT1 또는 List<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; } 
} 
+2

무엇이 질문입니까? –

+0

제네릭과 함께 리플렉션을 사용하여 올바른 형식 매개 변수로 get 메서드를 호출 할 수 있지만 개체를 ​​반환하는 것보다이 방법이 더 좋을 수 있습니다. 컴파일 할 때 타입을 알지 못하기 때문에 타입을 알 수 없으며 객체를 반환하면 GetType을 사용하여 찾을 수 있습니다. –

+0

Voila, 업데이트 됨 : –

답변

1

캐시의 반환 형식 중 하나를 object 수있다 또는 dynamic. 캐시에 넣는 클래스에는 공통점이 없으므로 다른 가능성은 없습니다.

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

+0

물론 그렇지만 나는 way withtout은 타입을 제공하지만 불가능할 수도 있습니다. –

+0

좋습니다. 그런 다음 리플렉션을 사용하여 런타임에 형식을 가져오고 메서드를 생성 할 수 있습니다 (나중에 컴파일러에서 나중에 추가 하겠습니다!).하지만 이전에 작성한 주석을 참조하십시오. 그렇지 않은 경우 참조하십시오. 컴파일 타임에 타입을 사용하면 왜 그냥 객체를 반환하지 않을까요? –

+0

그게 도움이 될지 모르지만. 결국 무엇을 이루려고합니까? –

0

Generics?

public T GetObjectFromKey<T>(string key) 
{ 
    return (T)_cache.Get(key); 
} 
+0

물론,하지만 형식을 제공하지 않는 방법을 찾길 기대했지만 가능하지 않을 수 있습니다. –

+0

컴파일 타임에 형식을 모르는 경우 Get 메서드가 개체를 반환하기 때문에 형식이 작동하지 않습니다. –

관련 문제