如何动态创建属性?

时间:2013-11-11 13:48:47

标签: c# reflection

我需要动态创建属性 我的情况是这样的:
我有许多派生自BaseClass的类。 BaseClass有一个字典,其中继承的类应该定义东西。这些定义是这样完成的。

public string Type 
{
    get 
    {
        return dictionary["type"];
    }
    set
    {
        dictionary["type"] = value;
    }
}

在我的派生类中,我将有许多这样的继承方法,其中属性的名称几乎与引用字典中相应值的键相同。所以我的想法是在派生类中添加属性,从下划线开始,以区分它们并使用它们来创建这些属性。

  1. 如何在运行时动态定义这些属性?
  2. 是否可以在编译时定义它们?这样做会有意义吗?

3 个答案:

答案 0 :(得分:2)

除非遗漏了什么。您可以使用ExpandoObject执行此类操作。

dynamic obj = new ExpandoObject();
obj.Type = "123";//Create Type property dynamically
Console.WriteLine(obj.Type);//Access dynamically created Type property

答案 1 :(得分:0)

您可以按如下方式动态创建函数,

Expression<Func<int, int, string>> exp = (x, y) => (x + y).ToString();
var func = exp.Compile();
Console.WriteLine(func.Invoke(2, 3));

您也可以将它们放入字典中并动态使用它们。

Expression<Func<int, int, string>> expSum = (x, y) => (x + y).ToString();
Expression<Func<int, int, string>> expMul = (x, y) => (x*y).ToString();
Expression<Func<int, int, string>> expSub = (x, y) => (x - y).ToString();

Dictionary<string, Expression<Func<int, int, string>>> myExpressions =
    new Dictionary<string, Expression<Func<int, int, string>>>();

myExpressions.Add("summation", expSum);
myExpressions.Add("multiplication", expMul);
myExpressions.Add("subtraction", expSub);

foreach (var myExpression in myExpressions)
{
    Console.WriteLine(myExpression.Value.Compile().Invoke(2, 3));
}

答案 2 :(得分:0)

要在编译时构建它们(后面没有C#),请参阅PostSharp(它允许您定义自定义模式)

但要“创建”新功能,您可能会感兴趣:

  • Expression.Compile创建委托(动态方法,在.net 4.5中可以收集垃圾) 优点:那仍然是C#。缺点:这不允许创建类型。

  • 如果要在运行时发出动态类型或方法,请
  • Reflection.Emit(在.Net框架中)或Mono.Cecil(第三方)。 使用这个,你的问题的解决方案是将你的属性定义为抽象,并动态创建一个类型(在运行时),它继承了你在C#中定义的抽象类,自动实现它。 优点:非常强大。缺点:你必须学习IL:)