【发布时间】:2011-05-25 18:12:53
【问题描述】:
在我的 C# 应用程序中,我有一个对象,例如。属性 Color 和 Size,并从 db 值填充。
然后我有一个设计器应用程序,它允许用户添加 C#/VB 代码(具有特定方法的整个类),这些代码可能会或可能不会使用/更改对象属性中的值
当应用程序运行时,将根据设计器应用程序创建的字符串在内存中创建(codeprovider)类,并在运行时调用特定方法(反射)
我如何允许动态代码的方法引用我的对象(非静态并从用户特定数据填充),以便如果用户添加代码,例如:
if(TheObject.Color == "Blue")
TheObject.Width="150";
如果我将对象作为输入参数传递给动态类中的方法,我可以让它工作:
....
ocResults = oCodeProvider,CompileAssemblyFromSource(oCParams, userCode);
oAssy = oCResults.CompiledAssembly;
oExecInstance = oAssy.CreateInstance("userClass");
oType = oExecInstance.GetType();
oType.GetMethod("OnLoad", new Type[] { typeof(myObj) });
但无法确定将对象放置在何处以便动态代码可以引用它(动态代码将为每个用户生成并执行,但他们必须引用为其会话创建的对象。
用户的代码应该易于编写,并且不必从例如获取参考。静态Dictionary<String,Object>(通过用户代码AppDic["UserName"].Color引用),然后在执行动态代码时再次将其从字典中删除。
用户代码应该是:TheObject.Color(就像一个静态方法,因为用户代码不需要创建实例,创建动态代码的代码已经填充了属性值。用户必须能够改变/阅读);
谁能帮忙?
【问题讨论】:
-
请正确格式化代码。另外,你问的是什么语言?
-
TheObject该死的!我有这个名字的课。
标签: c# .net reflection dynamic