2010-06-21 168 views
1

我正在嘗試從web.config文件讀取有關對象的信息,並基於此創建對象。但是,我只希望能夠從擴展特定接口的類創建對象(IModule)。該類型的對象是從類型屬性來在web.config:C#類型擴展接口

<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> 

在我的代碼,ASPNETMVCMODULES.TestModule呢,其實,延長IModule和它加載就好了用下面的代碼:

我遇到的問題是,因爲我將每個對象定義爲IModule,所以我無法訪問我添加到擴展類中的任何其他方法或屬性。有什麼辦法讓我用自己的類型創建對象,同時確保它可以延伸IModule?可能使用System.Convert值得從IModule轉換爲TestModule(在這種情況下)?

理想情況下,我希望能夠使用modT定義對象,該對象是直接來自web.config的對象的類型。

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

您可以確定如果一個類有下面的代碼位的特定接口:

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; 
} 

希望這是你追求的。

+0

這確實有助於確保只有那些擴展接口的類被加載,謝謝。不過,我仍然在創建'modT'的實例時遇到了問題。如果我沒有將'Activator.CreateInstance(modT);'轉換爲'IModule',那麼我將無法在代碼中稍後訪問其方法和屬性。 – AndyBursh 2010-06-21 10:36:19

+0

@AndyBrush - 我更新了答案。這是你的意思嗎?這是你已經完成的,它應該工作得很好。 – GenericTypeTea 2010-06-21 10:38:10

+0

@GenericTypeTea謝謝。此代碼適用於從web.config加載所有模塊,但是當我需要訪問類型爲「modT」的任何其他方法或屬性時,它會開始變形。有沒有辦法顯式創建一個'modT'對象而不是'IModule'?也許類似於'IModule ob =(IModule)Activator.CreateInstance(modT);'? – AndyBursh 2010-06-21 10:44:37

0

你有幾個不同的選擇,我已經使用了這兩個我自己。

  1. 使用
  2. Activator.CreateInstance(T)創建一個實例然後設置使用反射,PropertyInfo[] props = typeof(T).GetProperties()自己的屬性,並試圖找到在您創建的實例的屬性。
+0

感謝您的輸入,但我現在正確地創建了所有對象和設置屬性。我的問題是輸入這些對象;我需要它們與'modT'中的類型相同,而不是'IModule',它是它們擴展的接口,以便在後續代碼中訪問它們的屬性和方法。 – AndyBursh 2010-06-21 10:49:03