2013-10-09 61 views
1

我得充滿了子類的列表類:如何提取對象名稱

public class ClassOfKb 
{ 
    public List<Data> KbDatas {get;set;} 
    public List<Product> KbProducts {get;set} 
} 

public class Data 
{ 
    public Guid ID {get;set;} 
    public byte[] data {get;set;} 
    public string Name {get;set;} 
} 
public class Product 
{ 
    public Guid ID {get;set;} 
    public string Name {get;set;} 
    public byte[] Image {get;set;} 
} 

我創建一個對象:

ClassOfKb kb = new ClassOfKb 

現在我想提取字符串「從子對象kb.KbDatas DATAS」,我想:

string name = kb.KbDatas.GetType().BaseType.Name.Substring(2); 

藏漢爲:

string name = kb.KbDatas.GetType().Name.Substring(2); 

但沒有給我我需要什麼,有沒有辦法做到這一點?

編輯:指定我的問題,我需要的字符串是列表的名稱,除了前兩個字母! KbDatas => DATAS

EDIT2:我做了一個錯誤,該列表的名稱和類名是不同的,我需要的列表名稱

+0

我沒有看到一個名爲「數據」字符串。你的問題討論'數據',你的代碼意味着你正在嘗試使用'名稱'。請澄清。 –

+0

看到我的編輯:我想得到我的名單 –

+0

名稱的一部分調用'kb.KbData.GetType()'獲得一個屬性類型可以通過調用該屬性 – Aik

回答

3

您可以使用Type.GetGenericArguments來解決這個

 ClassOfKb kb=new ClassOfKb(); 
     kb.KbData = new List<Data>(); 
     string nameOfData = Type.GetType(kb.KbData.ToString()).GetGenericArguments().Single().Name; 

OUTPUT: nameOfData =數據

 kb.KbProduct = new List<Product>(); 
     string nameOfProduct = Type.GetType(kb.KbProduct.ToString()).GetGenericArguments().Single().Name; 

OUTPUT: nameOfProduct =產品

+0

的作品,但不是我想要的,也許我的問題是誤導,我編輯它,任何想法如何提取列表名稱與函數一樣簡單,你的第一個? –

0

由於這是一個集合,很可能有多個在Data對象它,每個都有一個名字。您可以使用String.Join用分隔符Concat的他們:

string names = string.Join(",", kb.KbData.Select(d => d.Name)); 

如果只有一個對象,你沒有在最後得到一個逗號。如果沒有對象,你會得到一個空字符串。

0

erm,因爲您有ListData會有一系列的Name s。

IEnumerable<string> names = kb.KbData.Select(d => d.Name); 

也許你想只是第一個?

string firstName = kb.KbData.First(d => d.Name); 
0

試試這個

string name = kb.KbData[0].Name.Substring(2); 
0

如果您想獲得屬性的名稱。有幾種方法可以做到這一點。

從屬性本身獲取泛型參數的名稱 - 如果知道屬性的名稱。

ClassOfKb kb = new ClassOfKb() 
    { KbData = new List<Data>(), KbProduct = new List<Product>() }; 
Console.WriteLine(kb.KbData.GetType().GetGenericArguments()[0].Name); 

如果知道屬性的數據類型,則從反射中獲取屬性的名稱。

System.Reflection.PropertyInfo pi = kb.GetType() 
      .GetProperties() 
      .FirstOrDefault(p=>p.PropertyType == typeof(List<Data>)); 
Console.WriteLine(pi.Name.Substring(2)); // ignoring the kb prefix 
0

您可以通過反射來實現這一點。這是例如沒有任何檢查 - 就顯示出機制:

PropertyInfo propertyInfo = typeof(ClassOfKb).GetProperty("KbData"); 
Type propertyType = propertyInfo.PropertyType; 
Type genericArgument = propertyType.GenericTypeArguments[0]; 
string name = genericArgument.Name; 

因爲財產KbData是通用的,你需要問物業類型的通用參數List<Data>propertyType.GenericTypeArguments[0],你應該測試,如果類型是真正通用的genericArgument.IsGenericType和檢查通用參數計算

+0

副作用,所以它似乎沒有使用自動方法來實現這一點,我可以通過幾個列表來獲取字符串(沒有在GetProperty()中指定名稱manualy,這是我期望的結果) –

+0

您可以使用'typeof(ClassOfKb).GetProperties()'檢索所有屬性並根據需要對其進行過濾。然後簡單地預測所有預期的屬性。 – Aik

0

如果你需要比你可以使用Expression屬性名。 下面的代碼定義函數摘錄名舞會屬性:

public string GetPropertyName<T>(Expression<Func<T>> property) 
{ 
    return ((MemberExpression)property.Body).Member.Name; 
} 

此轉換屬性屬性名字符串:

GetPropertyName(()=>k.KbDatas).Substring(2)