2013-07-29 2 views
0

У меня есть простой класс с некоторыми свойствами, и я хотел бы иметь возможность выставить метод select, чтобы вернуть другой объект (как и метод выбора linq). Например:Custom Select Projection

class Person 
{ 
    public string Name{get; set;} 
    public string Address {get; set;} 
    public string City {get; set;} 

    public TItem SelectProjection(..); 
} 

Person p = new Person(); 
var other = p.SelectProjection(p => new { p.Name, p.City}); 

Возможно ли это?

@@ EDIT

Я пользовательский класс для бизнес-логики, но я разоблачить IList только не его поддерживать мой код развязкой (не IQueryable). Итак, если вы хотите выполнить некоторую проекцию вы можете заполнить свою строку свойства с запятой разделителем:

BusinessClass.SelectFields = "Name, Surname, City"; 

Но, кстати, это просто манипуляция неправильное имя свойство, так что я предпочитаю лямбда:

BusinessClass.SelectField = p => new {p.Name, p.Surname, p.City}; 
+0

Так почему бы не назвать Select? –

+2

Не могли бы вы описать, что вы пытаетесь выполнить немного больше? В настоящее время неясно, чего вы хотите достичь, и почему вы не просто используете метод select, как предлагает @PanagiotisKanavos. – Kevin

+0

Вы не отключаете ничего, если вы предоставляете IList вместо IQueryable, совсем наоборот. IList - более конкретный интерфейс, чем IQueryable, плюс IList подразумевает, что выбор уже выполнен, в то время как IQueryable позволяет отложить выполнение –

ответ

1

Надеюсь, это то, что вы имеете в виду.

public T SelectProjection<T>(Func<T> personFunc) 
{ 
     return personFunc(); 
} 

Person p = new Person(); 
p.Address = "TestAdress"; 
var x = p.SelectProjection<dynamic>(() => new {p.Address}); 

Выход:

enter image description here

Пример 2:

Person p = new Person(); 
    p.Address = "TestAdress"; 
    p.City = "TestCity"; 
    var x = p.SelectProjection<dynamic>(() => new {p.Address, p.City}); 

Выход:

enter image description here

+0

Да. Это было действительно просто. Спасибо. – bit

+0

Добро пожаловать! Наслаждайся этим:) –

0

Да, это возможно. Делегаты исследований, IEnumerable<T> и заявление yield return. Не зная точно, чего вы пытаетесь достичь, трудно дать более точный ответ.