2008-10-24 6 views
1

나는 추상 일반 클래스 BLL<T> where T : BusinessObject 있습니다. 구체적인 BLL 클래스 집합을 포함하는 어셈블리를 열고 사전 내에 튜플 (businessObjectType, concreteBLLType)을 반환해야합니다. 지금까지 할 수있는 방법 중 일부가 있지만 T를 발견하는 데 문제가 있습니다.일반 및 유형 유추

protected override Dictionary<Type, Type> DefineBLLs() 
{ 
    string bllsAssembly = ConfigurationManager.AppSettings["BLLsAssembly"]; 

    Type[] types = LoadAssembly(bllsAssembly); 

    Dictionary<Type, Type> bllsTypes = new Dictionary<Type, Type>(); 

    foreach (Type type in types) 
    { 
    if (type.IsSubclassOf(typeof(BLL<>))) 
     /* how to know T in the situation below? */ 
     bllsTypes.Add(??businessObjectType (T)??, type); 
    } 

    return bllsTypes; 
} 
+0

그럼, T는 여기까지 관련 않습니다

코드는 다음에이되었다? 코드가 나타내는 것은 분명하지 않습니다 (적어도 나에게). –

+0

Jon이 코드를 정리했다고 생각합니다. –

답변

3

따라서 구체적인 클래스는 일반이 아닌 닫힙니 까? 저는 여기에 후 당신 생각 것을 보여 짧은 프로그램 ... 내가 적절한 기본 유형에 도착 우리는 한 단계 위로 이동해야 있으리라 믿고있어 여기

using System; 
using System.Reflection; 

public abstract class Base<T> 
{ 
} 

public class Concrete : Base<string> 
{ 
} 

class Test 
{ 
    static void Main() 
    { 
     Type type = typeof(Concrete); 
     Type baseType = type.BaseType; 
     Type typeOfT = baseType.GetGenericArguments()[0]; // Only one arg 
     Console.WriteLine(typeOfT.Name); // Prints String 
    } 
} 

주입니다 구체적인 수업 으로 마감됩니다. 물론 실제 코드에 더 많은 수표를 넣고 싶지만 GetGenericArguments이라는 코드가 누락되었다고 생각됩니다.

0

존, 정확히 내가 찾고있는 것입니다. 나는 반사 및 제네릭의 기초를 사용하므로 API에 대한 두 가지 지식에 대한 더 깊은 지식이 필요할 때, 나는 대답과 같은 것들을 놓친다.

귀하의 가정은 옳고 구체적인 클래스는 닫혀 있고 T는 기본 클래스 (BLL)에 정의되어 있습니다.

protected override Dictionary<Type, Type> DefineBLLs() 
{ 
    string bllsAssembly = ConfigurationManager.AppSettings["BLLsAssembly"]; 

    Type[] types = LoadAssembly(bllsAssembly); 

    Dictionary<Type, Type> bllsTypes = new Dictionary<Type, Type>(); 

    foreach (Type bllType in types) 
    { 
    if (bllType.IsSubclassOf(typeof(BLL<>))) 
    { 
     Type baseType = bllType.BaseType; 
     Type businessObjectType = baseType.GetGenericArguments()[0]; 
     bllsTypes.Add(businessObjectType, bllType); 
    } 
    } 

    return bllsTypes; 
} 
+0

나는 적어도 다음과 같은 코멘트를 추가하고 싶다. "우리가 더 깊은 클래스 계층 구조를 가지고 있다면 깨질 것입니다!" 그냥 당신이 쾅 때 어떤 잘못인지 알아 :) –

+0

좋아, Jon, 내 경우에는 BLL 동시에 구체적인 것들에서 즉각적인 기본 클래스와 BLL 자체가 상속을 사용하지 않습니다;) –