2014-12-15 3 views
1

Я пытаюсь динамически добавлять свойства к частичному классу. Эти свойства не будут известны в compiletime и должны быть добавлены во время выполнения.Динамически компилировать и добавлять частичный класс к сборке

Я написал код, чтобы сделать это, но, кажется, добавлено два разных класса вместо объединения классов.

Класс компилируется просто отлично, но как новый класс.

Следует отметить, что исходный класс IS является частичным классом, и я могу объединить частичный класс, если он добавлен как файл класса во время компиляции.

const string DynamicClass = @" 
public partial class activity 
{ 
public int? client_id { get; set; } 
public int? brand_id { get; set; } 
public int? financial_group_id { get; set; } 
public int? financials_locked { get; set; } 
public int? inv_exchange_rate_id { get; set; } 
public int? fin_exchange_rate_id { get; set; } 
public int? funding_acct_id { get; set; } 
public int? synch_lock { get; set; }  
} 
"; 

public static void AddDynamicMapping() 
{ 
    var properties = typeof (activity).GetProperties(); // Check properties of class before I add the partial class 
    var provider = CSharpCodeProvider.CreateProvider("c#"); 
    var options = new CompilerParameters(); 
    var assembly = 
     AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(ex => ex.GetTypes().Any(at => at.Name == "activity")); 
    var assemblyContainingNotDynamicClass = Path.GetFileName(assembly.Location); 
    options.ReferencedAssemblies.Add(assemblyContainingNotDynamicClass); 
    var results = provider.CompileAssemblyFromSource(options, new[] { DynamicClass }); 
    if (results.Errors.Count > 0) 
    { 
     foreach (var error in results.Errors) 
     { 
      Console.WriteLine(error); 
     } 
    } 
    else 
    { 
     var t = results.CompiledAssembly.GetType("activity"); 
     var properties2 = t.GetProperties(); // Class has been compiled and has it's own properties 
     properties = typeof(activity).GetProperties(); // properties of original class remain unchanged 
     var i = 0; 
    } 
} 
+1

Итак, у вас есть уже скомпилированный класс под названием 'activity', и вы хотите динамически добавлять к нему участников? Я почти уверен, что это невозможно. –

+0

Так что происходит в этом случае. У сборки теперь есть два класса с тем же именем? – Smeegs

+0

Вам нужно будет создать прокси. Вот что делают некоторые структуры, такие как NHibernate и EF. Посмотрите [Dynamic Proxy [Замок проекта Dynamic Proxy] (http://www.castleproject.org/projects/dynamicproxy/), это то, что Nhibernate использовал до версии два. – Andre

ответ

2

Я не знаю способ динамически добавлять элементы к уже скомпилированного класса, но только делает его partial конечно, не делает разницы. Все partial действительно позволяет разделить код между несколькими файлами, все из которых должны присутствовать во время компиляции. Он не добавляет метаданных, которые делают класс «расширяемым». От MSDN:

Все детали должны быть доступны во время компиляции для формирования окончательного типа.

Некоторых альтернативы:

  • декоратор
  • добавить словарное свойство "свойство" динамически
  • виртуальные члены и суб-причислять
  • методы расширения (обратите внимание, что расширение свойства в настоящее время не поддерживаются)
+0

Спасибо, я посмотрю на другие варианты, которые вы упомянули. – Smeegs

Смежные вопросы