0

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

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

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

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

3 回答 3

2

除非我错过了什么。你可以用ExpandoObject.

dynamic obj = new ExpandoObject();
obj.Type = "123";//Create Type property dynamically
Console.WriteLine(obj.Type);//Access dynamically created Type property
于 2013-11-11T13:54:53.473 回答
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));
}
于 2013-11-11T13:54:45.390 回答
0

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

但要“创建”新功能,您可能对以下内容感兴趣:

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

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

于 2013-11-11T13:59:12.700 回答