Для оператора выбора Linq, как построить подкласс общим способом во время выполнения? - PullRequest
1 голос
/ 28 июня 2010

Поддельный код:

  public class ParentClass
      { decimal quantity, 
        decimal price
      }

  IQueryable<ParentClass> parents;

  //SonClass is created at run time 
  //SonClass has some extra property, such as amount=quantity*price, which is defined by a string at run time

  IQueryable<SonClass> sons=parents.Select(p=>new SonClass(p){ attachedProperty1=..., attachedProperty2=...})

Если у меня есть исходный код ParentClass, я знаю, как создать sonClass во время выполнения. На самом деле SonClass должен иметь подходящий конструктор для оператора выбора Linq. Я попробовал следующий поддельный код:

    public SonClass(ParentClass parent)
{
... 
}

Когда у нас нет исходного кода ParentClass, как написать универсальный код?

Или, может быть, у вас есть новый способ получить тот же результат. Желаемые результаты - динамическое создание подкласса ParentClass с дополнительными свойствами только для чтения, определенными оператором Linq Select.

Заранее спасибо.

Ин

Ответы [ 3 ]

1 голос
/ 28 июня 2010

Я не верю, что это (в настоящее время) возможно. Из Руководства для программистов C # на MSDN относительно анонимных типов :

Анонимные типы являются ссылочными типами которые происходят непосредственно от объекта. компилятор дает им имя, хотя ваше приложение не может получить к нему доступ. С точки зрения общего язык выполнения, анонимный тип ничем не отличается от любой другой ссылки тип, за исключением того, что он не может быть приведен к любой тип, кроме объекта.

0 голосов
/ 28 июня 2010

Похоже, вы хотите создать динамический тип, который расширяет существующий тип и внедряет пользовательские свойства. Я почти уверен, что это невозможно в одном операторе LINQ (вам понадобится либо динамика C # 4.0, либо какое-то безумие отражения).

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

var sons = parents.Select(p =>new { parentProperty1=p.Prop1, attachedProperty1=..., tachedProperty2=...});

Или:

var sons = parents.Select(p =>new { parent=p, attachedProperty1=..., tachedProperty2=...});

В качестве альтернативы, почему у вас нет свойства «дополнительные свойства» (тип объекта или словарь) в вашем ParentClass, чтобы вы могли сделать это:

var sons = parents.ForEach(p => p.AdditionalProps = new { attachedProperty1=..., tachedProperty2=...});

Вы могли бы написать метод расширения, который использовал отражение, чтобы захватить все общедоступные свойства данного объекта, объединить их с данным анонимным объектом (вашим "присоединенным объектом и т. Д. Объектом") и вернуть новый анонимный объект со всеми объединенными свойствами. Однако это было бы плохим решением - возможно, лучшим решением было бы возвращение Dictionary вместо анонимного типа, потому что даже если вы создали объединенный анонимный тип, вы не сможете получить доступ к его свойствам в типобезопасный способ.

0 голосов
/ 28 июня 2010

вам не нужно создавать какой-либо подкласс, анонимный класс генерируется для вас во время выполнения

var sons=parents.Select(p=>new { attachedProperty1=p..., attachedProperty2=p...})
foreach (var son in sons){
     Console.WriteLine(son.PropertyName);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...