我有一个充满子类列表的类:
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 =&gt; DATAS
EDIT2:我犯了一个错误,列表名称和类名不同,我需要列表名称
答案 0 :(得分: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 =产品
答案 1 :(得分:0)
由于这是一个集合,因此可能存在多个Data
个对象,每个对象都有一个名称。您可以使用String.Join
将它们与分隔符连接起来:
string names = string.Join(",", kb.KbData.Select(d => d.Name));
如果只有一个对象,则最后不会得到逗号。如果没有对象,则会得到一个空字符串。
答案 2 :(得分:0)
嗯,因为List
Data
Name
会有IEnumerable<string> names = kb.KbData.Select(d => d.Name);
s序列。
string firstName = kb.KbData.First(d => d.Name);
也许你只想要第一个?
{{1}}
答案 3 :(得分:0)
试试这个
string name = kb.KbData[0].Name.Substring(2);
答案 4 :(得分:0)
根据您所写的内容的声音,您是否希望在List实例KbData中获取该类型的名称?
如果是这样,我认为这可能是您正在寻找的内容:https://stackoverflow.com/a/1043778/775479
答案 5 :(得分: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
答案 6 :(得分: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
测试该类型是否真正通用并检查通用参数计数
答案 7 :(得分:0)
如果您需要属性名称,则可以使用Expression。 下面的代码定义了提取名称prom一个属性的函数:
public string GetPropertyName<T>(Expression<Func<T>> property)
{
return ((MemberExpression)property.Body).Member.Name;
}
这会将属性转换为属性名称字符串:
GetPropertyName(()=>k.KbDatas).Substring(2)