2013-10-09 6 views
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 

теперь я хотел бы, чтобы извлечь строку " Datas»из подобъектов kb.KbDatas, я попробовал:

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

как хорошо, как:

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

но ничего не дало мне то, что мне нужно, есть ли способ сделать это?

EDIT: указать свой вопрос, строка, в которой я нуждаюсь, - это имя списка, за исключением первых двух букв! KbDatas => DATAS

edit2: я сделал ошибку, список-имена и классы-имена различны, и мне нужно имя-списка

+0

Я не вижу строку под названием «Data». В вашем вопросе обсуждается «Данные», ваш код подразумевает, что вы пытаетесь работать с «именем». Просьба уточнить. –

+0

см. Мое редактирование: я хотел бы получить часть имени моего списка –

+0

, вызывающего 'kb.KbData.GetType()', чтобы получить тип свойства, может сделать побочный эффект, вызвав это свойство – Aik

ответ

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 = Продукт

+0

работает, но не так, как я этого хотел, возможно, мой вопрос был введен в заблуждение, я его отредактировал, любую идею, как извлечь имя-списка с такой простой, как ваша первая функция? –

0

Поскольку это собрание вполне вероятно, что имеются множественные Data объектов он, каждый с именем. Вы можете использовать String.Join для Concat их с разделителем:

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

Если есть только один объект, который вы не получите запятой в конце. Если нет объекта, вы получите пустую строку.

0

erm, так как у вас есть List из Data будет последовательность Name s.

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

Возможно, вам нужен только первый?

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

Попробуйте один

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

из звуков, что вы написали, вы хотите, чтобы получить имя типа в списке экземпляров KbData?

Если да, то я думаю, что это может быть то, что вы ищете: https://stackoverflow.com/a/1043778/775479

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 
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 и проверкам подсчитывать общие аргументы

+0

, поэтому кажется, что нет способ архивировать это с автоматическим методом, где я могу передать несколько списков, чтобы получить строку (без указания имени в GetProperty() вручную, что является результатом, который я ожидаю) –

+0

вы можете использовать 'typeof (ClassOfKb) .GetProperties()' для получения всех свойств и их фильтрации по мере необходимости. Затем просто выберите все ожидаемые свойства. – Aik

0

Если вам нужно имя свойства, чем вы можете использовать Expression. Кода ниже определение функции для имени экстракт пром свойство:

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

Это преобразующего свойство Имени свойства строки:

GetPropertyName(()=>k.KbDatas).Substring(2) 
Смежные вопросы