2010-06-21 5 views
1

현재 web.config 파일에서 개체에 대한 정보를 읽고이를 기반으로 개체를 만들고자 시도 중입니다. 그러나 특정 인터페이스 (IModule)를 확장하는 클래스에서 객체를 만들 수 있기를 바랍니다. ASPNETMVCMODULES.TestModule은, 사실, IModule를 확장 않는다, 내 코드에서C# type extends interface

<module moduleAlias="Test" type="ASPNETMVCMODULES.TestModule" connectionStringName="ApplicationServices"> 
    <properties> 
     <property name="prop1" value="abc" type="System.String"/> 
     <property name="prop2" value="123" type="System.Int32"/> 
    </properties> 
    </module> 

그리고 아래의 코드와 잘에로드 : 오브젝트의 유형은 Web.config의에서 type 속성에서 오는

내가 가지고있는 문제는 모든 객체를 IModule으로 정의했기 때문에 확장 클래스에 추가하는 모든 추가 메서드 나 속성에 액세스 할 수 없다는 것입니다. 자체 유형으로 객체를 만들 수있는 방법이 있습니까? 그렇지만 IModule을 확장 할 수 있습니까? System.Convert을 사용하면 IModule에서 TestModule (이 경우)으로 변환 할 가치가 있습니까?

이상적으로는 web.config에서 직접 객체 유형 인 modT을 사용하여 객체를 정의 할 수 있기를 바랍니다.

public void LoadModules() 
{ 
    // ... 

    Type modT = Type.GetType(mod.ModuleType); 
    if (InheritsFromInterface(modT, typeof(IModule)) 
    { 
     IModule ob = (IModule)Activator.CreateInstance(modT); 
     // ... 
    } 
} 

public bool InheritsFromInterface(Type inheritor, Type interface) 
{ 
    Type result = inheritor.GetInterface(interface.FullName); 
    return result != null; 
} 

희망이 필요하시면 : 클래스는 다음과 같은 코드를 가진 특정 인터페이스가있는 경우

public void LoadModules() 
    { 
     ASPNETMVCMODULES.Configuration.ModulesSection allModules = (ASPNETMVCMODULES.Configuration.ModulesSection)System.Web.Configuration.WebConfigurationManager.GetSection("mvcmodules"); 
     foreach (Configuration.Module mod in allModules.Modules) 
     { 
      Type modT = Type.GetType(mod.ModuleType); 

      IModule ob = (IModule)Activator.CreateInstance(modT); 
      foreach (ASPNETMVCMODULES.Configuration.ModuleProperty modP in mod.ModuleProperties) 
      { 
       object origVal = modP.Value; 
       object newVal = Convert.ChangeType(origVal, Type.GetType(modP.PropertyTypeString)); 
       ob.Properties.Add(modP.Name, newVal); 
      } 

      //Have to add some properties manually 
      ob.Properties.Add("ConnectionString", (string)mod.ConnectionString); 

      //RegisterModule(string, IModule) 
      RegisterModule(mod.ModuleAlias, ob); 
     } 
    } 

감사

답변

2

당신은 확인할 수 있습니다.

+0

확실히 인터페이스를 확장하는 클래스 만로드되도록하는 데 도움이됩니다. 감사합니다. 그러나, 나는 여전히'modT' 인스턴스를 생성하는데 문제가 있습니다. Activator.CreateInstance (modT);를'IModule'으로 캐스팅하지 않으면 코드의 메소드와 속성에 액세스 할 수 없습니다. – AndyBursh

+0

@AndyBrush - 답변을 업데이트했습니다. 그게 당신이 의미 한 것입니까? 그것은 당신이 이미 해낸 것이므로 잘 작동합니다. – GenericTypeTea

+0

@GenericTypeTea 감사. 이 코드는 web.config에서 모든 모듈을로드하는 데는 잘 작동하지만'modT '유형에서 추가 메서드 나 속성에 액세스해야 할 때가지기 시작합니다. 'IModule'이 아닌'modT'의 객체를 명시 적으로 생성하는 방법이 있습니까? 아마도'IModule ob = (IModule) Activator.CreateInstance (modT);와 비슷한 방식으로? – AndyBursh

0

몇 가지 옵션이 있습니다.이 두 가지를 직접 사용했습니다. 사용

    1. 는 자신 반사, PropertyInfo[] props = typeof(T).GetProperties()를 사용하여 속성을 설정하고 생성 된 인스턴스의 속성을 찾으려고 Activator.CreateInstance(T)와 인스턴스를 만듭니다.
  • +0

    입력 해 주셔서 감사합니다.하지만 모든 개체 및 설정 속성을 지금 올바르게 만들었습니다. 내 문제는 이러한 개체를 입력하는 것입니다. 후속 코드의 속성과 메서드에 액세스하기 위해 확장 된 인터페이스 인 'IModule'대신 'modT'유형과 동일하게해야합니다. – AndyBursh