현재 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);
}
}
감사
확실히 인터페이스를 확장하는 클래스 만로드되도록하는 데 도움이됩니다. 감사합니다. 그러나, 나는 여전히'modT' 인스턴스를 생성하는데 문제가 있습니다. Activator.CreateInstance (modT);를'IModule'으로 캐스팅하지 않으면 코드의 메소드와 속성에 액세스 할 수 없습니다. – AndyBursh
@AndyBrush - 답변을 업데이트했습니다. 그게 당신이 의미 한 것입니까? 그것은 당신이 이미 해낸 것이므로 잘 작동합니다. – GenericTypeTea
@GenericTypeTea 감사. 이 코드는 web.config에서 모든 모듈을로드하는 데는 잘 작동하지만'modT '유형에서 추가 메서드 나 속성에 액세스해야 할 때가지기 시작합니다. 'IModule'이 아닌'modT'의 객체를 명시 적으로 생성하는 방법이 있습니까? 아마도'IModule ob = (IModule) Activator.CreateInstance (modT);와 비슷한 방식으로? – AndyBursh