如何提取对象名称

时间:2013-10-09 09:18:58

标签: c# visual-studio object gettype

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

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:我犯了一个错误,列表名称和类名不同,我需要列表名称

8 个答案:

答案 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)