我知道您可以使用Emit,System.Reflection和手动创建的IL代码动态创建.NET程序集,如下所示.
但我想知道是否有可能在正在运行的应用程序中实时动态创建和执行C#代码块.感谢您的任何意见或建议.
编辑: 据我所知,CodeDOM允许您将C#代码编译为EXE文件,而不是"只是"执行它.这里有一些背景信息以及为什么(据我所知)这对我来说不是最好的选择.我正在创建一个应用程序,必须执行这么多动态创建的代码[用于记录 - 它用于学术研究,而不是真实世界的应用程序,因此无法避免].因此,创建/执行数千个动态创建的EXE并不是非常有效.其次 - 所有动态代码片段都会返回一些难以从单独运行的EXE中读取的数据.如果我遗失了什么,请告诉我.
至于Jon Skeet指出的DynamicMethod方法,如果有一种更简单的方法来编写代码本身而不是低级IL代码,那么一切都会像魅力一样.
换句话说(非常严厉地说)我需要这样的东西:
string x = "_some c# code here_";
var result = Exec(x);
Run Code Online (Sandbox Code Playgroud) 我有一个简单的数组(或者你喜欢的设置)整数,让我们把它称为X.我还有另一个数组W,它存储数组X中元素的"权重"."权重"表示第n个元素应该有多大的可能性被选中.现在我需要一种方法(算法)来(伪)根据数组W中定义的"权重"从数组/集合X中随机选择一个元素.
例如,如果我的W看起来像这样:W [0] = 2; W [1] = 4; W [2] = 6;
这意味着从数组X中选择第N项的概率为:X [0] = 16.6%X [1] = 33.3%X [2] = 50%
所以方法get_pseudorandom_item(X)应该在所有时间的一半左右返回第二项.
任何想法或建议如何实现(使用任何编程语言)非常感谢.谢谢.
我想知道有没有办法覆盖Hashtable(或Dictionary)类,所以它会自动对对象进行装箱/拆箱操作.换一种说法:
myHashtable["value1"] = "this_is_string";
myHashtable["value2"] = 123;
string a = myHashtable["value1"];
int b = myHashtable["value2"];
// errors as expected, since i need to cast it to specific type from object
Run Code Online (Sandbox Code Playgroud)
显然C#不允许用不同的类型覆盖公共T这个[对象键]操作符,因为我试图做这样的事情:
public int this[object key] { get { return (base[key] as int); } set {} } // etc
public string this[object key] { get { return (base[key] as string); } set {} } // etc
// error
Run Code Online (Sandbox Code Playgroud)
任何想法或提示什么是最简单的方法(如果有的话),以避免在C#中使用关联数组时进行转换(没有必要严格使用Hashtable)?如果没有办法做到这一点,我会很感激,如果有一个比我更有知识的人,解释为什么会这样,以及它背后的基本原理是什么.
谢谢.
编辑: 我需要它的原因是,我正在创建一个自定义的设置类.设置可能具有不同类型的值,例如让"HowManyItemsToDisplay"具有某个整数值,而"NameOfSomeControl"将是一个字符串.因此,在编写类似以下内容时避免任何转换会很好:
myControl.Text = MySettings["SomeTextValue"];
Run Code Online (Sandbox Code Playgroud)
要么
while (MySettings["SomeIntValue"] > …Run Code Online (Sandbox Code Playgroud)