动态编译并将部分类添加到程序集

时间:2014-12-15 15:44:14

标签: c#

我试图动态地向部分类添加属性。这些属性在编译时将不知道,需要在运行时添加。

我已经编写了一些代码来执行此操作,但似乎添加了两个不同的类而不是组合类。

该类编译得很好,但作为一个新类。

值得一提的是,原始类是一个部分类,如果在编译时添加为类文件,我可以组合一个部分类。

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 个答案:

答案 0 :(得分:2)

我不知道如何动态地将成员添加到已编译的类中,但只是将它partial设置为肯定并没有什么不同。所有partial都允许代码在多个文件之间分割,所有这些文件必须在编译时出现。它不会添加任何使类具有可扩展性的元数据。来自MSDN

  

所有部件必须在编译时可用以形成最终类型。

一些替代方案:

  • 装饰图案
  • 将词典属性添加到"属性"动态
  • 虚拟成员和子类别
  • 扩展方法(请注意,此时不支持扩展属性