簡體   English   中英

如何從動態創建的類中引用對象的實例

[英]How do I get reference to an instance of an object from a dynamic created class

在我的C#應用​​程序中,我有一個對象,例如。 屬性ColorSize ,以及從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) });

但無法確定放置對象的位置,以便動態代碼可以引用它(動態代碼將為每個用戶生成和執行,但它們必須引用為其會話創建的對象。

用戶的代碼應該易於編寫,而不必從例如。 static Dictionary<String,Object> (通過用戶代碼AppDic["UserName"].Color引用),然后在執行動態代碼時再從字典中刪除它。

用戶代碼應該是: TheObject.Color (就像靜態方法一樣,因為用戶代碼不需要創建實例,創建動態代碼的代碼已經填充了屬性值。用戶必須只能更改/讀);

有人可以幫忙嗎?

基本上,一旦你在用戶代碼創建的Type上找到了你想要的MethodInfo ,就可以將對象作為參數發送給它。 如:

object userType = ... // compile user's code, load user's type from compiled assembly
MethodInfo myMethod = ... // find the wanted method on the user's type

// assuming the user code is in a static method to avoid having to create instances.
myMethod.Invoke(null, targetObj); 

如果您希望用戶只需要寫入:

theObject.Color;

然后你應該包裝用戶的代碼來生成類似的東西:

// BEGIN PREFIX
public static class UserType
{
    public static UserMethod(TheObject theObject);
    {
// END PREFIX, user code follows

theObject.Color = Color.Red;

// BEGIN SUFFIX
    }
}
// END SUFFIX

順便說一下,您選擇的設計會產生嚴重的安全后果。

例如,沒有什么可以阻止用戶代碼執行會導致應用程序終止,無響應或其他內容的操作。 故意與否。 例如,如果用戶輸入類似System.Windows.Forms.Application.Exit(); ,你無能為力。

這種可編程性的解決方案是在單獨的AppDomain運行用戶代碼,並向其發送目標對象,例如通過Remoting

編輯:嘗試建議一種不需要將對象作為參數傳遞的方法。

您可以使用單個類創建一個Assembly,該類將公開對象的靜態實例。 就像是:

public class TheInstance
{
    public static TheObject TheObject = new TheObject();
}

所以現在用戶代碼將能夠執行以下操作:

TheInstance.TheObject.Color = Color.Red;

而且你不必費心去發送參數。

為了使用戶代碼能夠訪問此程序集中的類,您需要做的就是在使用ICodeCompiler編譯用戶代碼時將此程序集指定為引用。

那是你在找什么?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM