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 => 数据

EDIT2:我做错了,列表名和类名不同,我需要列表名

4

8 回答 8

3

你可以Type.GetGenericArguments用来解决这个问题

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

输出: nameOfData = 数据

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

输出: nameOfProduct = 产品

于 2013-10-09T09:45:27.843 回答
0

You can achieve this with reflection. This is example without any checks - just show the mechanism:

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

Because property KbData is generic List<Data> you need ask for generic arguments of property type: propertyType.GenericTypeArguments[0] and you should test if the type is really generic by genericArgument.IsGenericType and check generic arguments count

于 2013-10-09T09:34:11.610 回答
0

由于这是一个集合,因此其中可能有多个Data对象,每个对象都有一个名称。您可以使用String.Join分隔符将它们连接起来:

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

如果只有一个对象,最后不会出现逗号。如果没有对象,您将得到一个空字符串。

于 2013-10-09T09:22:34.760 回答
0

erm,因为你有 a ListData所以会有一个Names 序列。

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

也许你只想要第一个?

string firstName = kb.KbData.First(d => d.Name);
于 2013-10-09T09:24:10.557 回答
0

试试这个

string name = kb.KbData[0].Name.Substring(2);
于 2013-10-09T09:25:17.317 回答
0

根据您所写的内容,您希望在 List 实例 KbData 中获取类型的名称?

如果是这样,我认为这可能是您正在寻找的:https ://stackoverflow.com/a/1043778/775479

于 2013-10-09T09:29:33.787 回答
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
于 2013-10-09T09:31:54.477 回答
0

如果您需要属性名称,则可以使用表达式。下面的代码定义了用于提取名称舞会属性的函数:

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

这会将属性转换为属性名称字符串:

GetPropertyName(()=>k.KbDatas).Substring(2)
于 2013-10-09T10:55:26.233 回答