2015-12-21 19 views
0

我有叫我的DbContext方法sqlquery的方法的方法是如下:如何從C#中的基類中的值,而無需使用屬性名

private IEnumerable<object> getRawDataDb(DependencySheet sheet, string name) 
{ 
    switch(name) 
    { 
     case "DefaultData": 
       return sqlQuery.Database.SqlQuery<DefaultData>(sheet.Query); 

     case "OpenInventory": 
       return sqlQuery.Database.SqlQuery<OpenInventory>(sheet.Query); 

     case "CompQuals": 
       return sqlQuery.Database.SqlQuery<CompQual>(sheet.Query); 
    } 

    return null; 
} 

從下面

調用上面的方法

foreach(var raw in rawData) 
{ 
    var tw = raw.GetType().BaseType.GetFields(BindingFlags.NonPublic|BindingFlags.Instance); 
} 

現在在執行時,我想:

var rawData = getRawDataDb(dependentData, sheetName).ToList(); 

,然後用如下foreach循環迭代它得到如下圖所示成一個在原始對象獲取圖像的值:

enter image description here

,但我不能夠獲得價值,我已經使用的GetType。

感謝 達曼

+4

爲什麼不只是有三種方法返回正確類型的值,並避免這種不必要的'name'參數和'switch'。這似乎是通過將這一切全部轉化爲單一的瑞士軍刀方法來製造問題。 –

+0

其實我們試圖使它成爲一種通用的方法 –

回答

0

如果我明白了,你的BaseClass:

public class BaseClass 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 

有的來自它繼承(例如OpenInventory):

public class OpenInventory : BaseClass 
{ 
    public string AnotherProperty { get; set; } 
} 

然後,你可以寫:

public IEnumerable<BaseClass> getRawDataDb(DependencySheet sheet, string name) 
{ 
    //type declaration OpenInventory must be located at the same assembly with getRawDataDb 
    var type = Assembly.GetExecutingAssembly().GetTypes().Where(x => x.Name == name).First(); 

    var res = new List<BaseClass>(); 
    var source = sqlQuery.Database.SqlQuery(type, sheet.Query); 

    foreach (var item in source) 
     res.Add(item as BaseClass); 

    return res; 
} 

它將執行你想要的東西:

var res = getRawDataDb(dependentData, sheetName).ToList(); 

因此,您將能夠顯式調用BaseClass的屬性:

res.First().ID 

而且你還可以通過顯式轉換調用另一個特性:

(res.First() as OpenInventory).AnotherProperty;  
+0

它不接受「T」 –

+0

你能詳細描述「T」有什麼問題嗎?我自己試過這段代碼,所有的都是有效的。 –

+0

現在它的工作,但我想getRawDataDb (dependentData).ToList(); 「OpenInventory」也應該是動態的,或者我可以撥打EF –

相關問題