如何提取对象名称

本文关键字:取对象 何提 | 更新日期: 2023-09-27 18:34:28

我有一个充满子类列表的类:

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,我试过:

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

以及:

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

但是什么都没有给我我需要的东西,有什么办法可以做到这一点吗?

编辑:要指定我的问题,我需要的字符串是列表的名称,除了前两个字母!KbDatas => Datas

编辑2:我做错了,列表名称和类名不同,我需要列表名称

如何提取对象名称

您可以使用Type.GetGenericArguments来解决此问题

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

输出 : 名称数据 = 数据

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

输出:产品名称 = 产品

由于这是一个

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

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

如果只有一个对象,则末尾不会有逗号。如果没有对象,则得到一个空字符串。

erm,因为你有一个DataList,所以会有一个Name s的序列。

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

也许你只想要第一个?

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

试试这个

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

从您编写的内容听起来,您希望在列表实例 KbData 中获取类型的名称?

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

如果您尝试获取属性的名称。 有几种方法可以做到这一点。

从属性本身获取泛型参数的名称 - 如果您知道属性的名称。

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

您可以通过反思来实现这一点。这是没有任何检查的示例 - 只需显示机制:

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测试该类型是否真的是泛型的,并检查泛型参数计数

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

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

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

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