2013-03-06 1 views
0

Это мой код:Расширение собственности и в то же время вставить новый элемент

var myList = myPage.News.Cast<MyNew>(); 

MyNew имеют нечто вроде 20 собственности (имя, должность, дата, место, и т.д. и т.п.), но пропустите одно свойство (например) Tel.

Невозможно воссоздать всю мою структуру (она также стала из DLL), поэтому я хотел бы быстрее добавить свойство MyNew под названием Tel, внутри этого списка. Поэтому расширьте класс во время вставки в списке.

+2

Возможно, вы можете добавить его в качестве метода расширения, называемого 'Tel()' to 'MyNew'? Отсутствие свойств расширения печально. – Lloyd

+1

Является ли класс 'MyNew' запечатанным, как будто вы не можете унаследовать от класса, добавляющего какие-либо свойства, которые вам нужны. – Kane

+0

Ожидаете ли вы, что это свойство должно быть доступно во время компиляции, чтобы вы могли перейти на него в C# кода или он участвует только в материалах времени выполнения? – sll

ответ

3

Нет, но вы можете создать анонимный тип, который включает в себя тип оригинала плюс ваш новый столбец:

var myList = myPage.News 
        .Cast<MyNew>() 
        .Select(new { m => MyNew = m, 
             Tel = [formula for tel] 
           } 
         ); 
1
public class MyNewExtended: MyNew { 
    public String Tel { get;set; } 
} 

var myList = myPage.News.Cast<MyNewExtended>(); 

(но см комментарий Криса Синклера ниже)

+2

Предполагая, что 'News' является' IEnumerable ',' Cast 'будет терпеть неудачу, потому что они _aren't фактически_ объекты типа подкласса. –

+0

Я понятия не имел Листинг () был настолько сложным («поведение Cast () было изменено между .NET 3.5 и .NET 3.5 SP1») - http://stackoverflow.com/questions/445471/puzzling- enumerable-cast-invalidcastexception –

+1

Просто подумайте об этом, как о буквальном типе-литье в _subclass_. Он не будет выполнять _conversion_, даже если существует явное/неявное преобразование. (но поскольку 'MyNewExtended' расширяет' MyNew', вы не сможете писать пользовательское преобразование в любом случае) –

-1

Вы должны быть в состоянии расширить MyNew с частичным классом следующим образом:

public partial class MyNew 
{ 
    public int Tel { get; set; } 
} 

Tel будет доступен как любое другое свойство.

+0

Нельзя использовать 'partial', потому что класс уже скомпилирован в другой DLL. –

+2

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

+0

-1 Vaze перечитывает, как ОП объясняет свою проблему в своем вопросе. 'partial class не поможет' – MethodMan