2013-10-09 117 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)