如何提取对象名称
本文关键字:取对象 何提 | 更新日期: 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,因为你有一个Data
的List
,所以会有一个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)