2011-04-29 29 views
1

我知道标题可能是真的很难理解,这是很难想象一个适当的标题,但这里的是我想做的本质。我可以获取作为布尔函数传递给函数的条件的字符串表示形式吗?

基本上我想有这样的方法:

void Validate(bool validation) 
{ 
    if (!validation) 
    { 
     throw new Exception(); 
    } 
} 

然后,我想这样称呼它:

try 
{ 
    Validate(1 > 2); 
} 
catch (Exception e) 
{ 
    // This is where I would output the error to the user 
} 

我想要得到的1 > 2部分作为一个字符串没有定义它作为其他地方,或评估字符串到bool,或使用谓词或使用外部方法。理想情况下,这将通过反思完成。我还会采取更好的方式来做我想做的事。假设bool可以是任何东西:1 > 2,"cheese" != "ham", objectA == objectB等。

+0

你能给更多的环境?这在哪里使用,以及如何?验证非常普遍,您似乎应该能够利用现有的解决方案。 – 2011-04-29 21:57:16

+0

我期待为我正在进行的项目做一个预处理器。我基本上将构建一个功能完整的C#类,它将通过CS-Script项目(http://www.csscript.net/)进行编译,我这样做是因为我想稍微贬低C#非程序员开发。其中一个预定义的方法是一个Validate()方法,它允许脚本执行比较,如果失败(甚至成功),我希望它在脚本执行期间显示屏幕上失败/成功的内容。 – MGSoto 2011-04-29 22:04:29

+0

另外作为一个方面说明,因为我知道我可以只读“脚本”并手动拉出比较,我想避免这种情况并执行后编译操作。 – MGSoto 2011-04-29 22:05:34

回答

5

你不能。嗯,也许你正好可以(在Python中,人们可以破解这样的事情一起,我认为,尽管这不漂亮,就不能可靠地工作,需要具有手头的源代码),但一般:

  • 您没有串码repesentations在运行时。被称为函数之前
  • 参数(表达式)进行评估。
  • 评估得出什么,但不记得它是从哪里来的半点一个孤独的布尔。

在您寻找一些令人讨厌的讨厌的黑客来模拟这个之前,请检查在编译过程中添加字符串文字是否更容易。

+0

选择你的,因为我看的越多,我就越觉得这是一个多么可怕的想法。我也意识到我将需要做更多的数据提取,而不是简单的。例如,我需要做一些类似Validate(PowerSupply.Current> 0.055);其中,电力供应是现实生活中电力供应的表现,并显示电力的当前状况以及与之相比的情况。我会采纳你的建议并寻找更好的解决方案。 – MGSoto 2011-04-29 22:19:27

1

你将能够获得最接近的是使用lambda表达式,这将看东西的效果:

void Validate(Expression<Func<bool>> validation) 
{ 
    if (!Lambda.Compile(validation)()) 
    { 
     string message = "..." //parse lambda expression here. 
     //see: http://msdn.microsoft.com/en-us/library/bb397951.aspx 

     throw new Exception(message); 
    } 
} 


try 
{ 
    Validate(() => 1 > 2); 
} 
catch (Exception e) 
{ 
    Console.Write(e.Message)// This is where I would output the error to the user 
} 

不过,说实话,我不知道这是值得的麻烦,你不会想用它在紧密循环,由于lambda表达式的动态编译(尽管你可能缓存如果需要编译的结果)

相关问题