我需要动态创建属性
我的情况是这样的:
我有许多派生自BaseClass的类。
BaseClass有一个字典,其中继承的类应该定义东西。这些定义是这样完成的。
public string Type
{
get
{
return dictionary["type"];
}
set
{
dictionary["type"] = value;
}
}
在我的派生类中,我将有许多这样的继承方法,其中属性的名称几乎与引用字典中相应值的键相同。所以我的想法是在派生类中添加属性,从下划线开始,以区分它们并使用它们来创建这些属性。
答案 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:)