![](/img/trans.png)
[英]Calling the .Any Extension Method with Entity Framework using Expression Trees
[英]Calling unsafe method using expression trees
我需要调用unsafe
原始指针的unsafe
方法。
为此,我需要构造表示由VariableExpression
或ParameterExpression
表示的值的指针的Expression
。
怎么做?
我通常使用Expression
方法是让C#编译器为我构建Expression
,具有出色的lambda解析能力,然后检查它在调试器中的作用。 但是,根据您描述的方案,我们几乎可以立即遇到问题:
新项目,设置'允许不安全'。
采用原始指针的方法:
class MyClass
{
public unsafe int MyMethod(int* p)
{
return 0;
}
}
构建表达式的代码:
class Program
{
unsafe static void Main(string[] args)
{
var mi = typeof (MyClass).GetMethods().First(m => m.Name == "MyMethod");
int q = 5;
Expression<Func<MyClass, int, int>> expr = (c, i) => c.MyMethod(&i);
}
}
我的目的是运行它,看看调试器中的expr
什么样的; 但是,当我编译时,我得到了
错误CS1944:表达式树可能不包含不安全的指针操作
查看此错误的文档 ,看起来您的“需要构造表示值的指针”才能满足:
表达式树可能不包含不安全的指针操作
表达式树不支持指针类型,因为
Expression<TDelegate>.Compile
方法只允许生成可验证的代码。 看评论。 [似乎没有任何评论!]纠正此错误
- 在尝试创建表达式树时,请勿使用指针类型。
我认为AakashM的答案很有用(利用编译器来构建表达式树的想法),所以不需要重复它。
但是,我不认为使用指针是完全不可能的:如果你没有取消引用指针,你可以传递存储在IntPtr
。 您可以在安全代码中使用和传递IntPtr
,因此在表达式树中使用它们也应该没有问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.