我试图动态地向部分类添加属性。这些属性在编译时将不知道,需要在运行时添加。
我已经编写了一些代码来执行此操作,但似乎添加了两个不同的类而不是组合类。
该类编译得很好,但作为一个新类。
值得一提的是,原始类是一个部分类,如果在编译时添加为类文件,我可以组合一个部分类。
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;
}
}
答案 0 :(得分:2)
我不知道如何动态地将成员添加到已编译的类中,但只是将它partial
设置为肯定并没有什么不同。所有partial
都允许代码在多个文件之间分割,所有这些文件必须在编译时出现。它不会添加任何使类具有可扩展性的元数据。来自MSDN:
所有部件必须在编译时可用以形成最终类型。
一些替代方案: