Я пытаюсь динамически добавлять свойства к частичному классу. Эти свойства не будут известны в 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;
}
}
Итак, у вас есть уже скомпилированный класс под названием 'activity', и вы хотите динамически добавлять к нему участников? Я почти уверен, что это невозможно. –
Так что происходит в этом случае. У сборки теперь есть два класса с тем же именем? – Smeegs
Вам нужно будет создать прокси. Вот что делают некоторые структуры, такие как NHibernate и EF. Посмотрите [Dynamic Proxy [Замок проекта Dynamic Proxy] (http://www.castleproject.org/projects/dynamicproxy/), это то, что Nhibernate использовал до версии два. – Andre