相关疑难解决方法(0)

使用表达式获取方法的名称

我知道网站上有一些答案,如果这有任何重复,我道歉,但我找到的所有答案都没有做我想做的事情.

我正在尝试指定方法信息,因此我可以通过不使用字符串以类型安全的方式获取名称.所以我试图用表达式提取它.

假设我想在此界面中获取方法的名称:

public interface IMyInteface
{
    void DoSomething(string param1, string param2);
}
Run Code Online (Sandbox Code Playgroud)

目前我可以使用THIS方法获取名称:

 MemberInfo GetMethodInfo<T>(Expression<Action<T>> expression)
 {
        return ((MethodCallExpression)expression.Body).Method;
 }
Run Code Online (Sandbox Code Playgroud)

我可以调用helper方法如下:

var methodInfo = GetMethodInfo<IMyInteface>(x => x.DoSomething(null, null));
Console.WriteLine(methodInfo.Name);
Run Code Online (Sandbox Code Playgroud)

但我正在寻找我可以获取方法名称而不指定参数的版本(null,null)

像这样:

var methodInfo = GetMethodInfo<IMyInteface>(x => x.DoSomething);
Run Code Online (Sandbox Code Playgroud)

但所有尝试都无法编译

有没有办法做到这一点?

c# lambda expression

26
推荐指数
2
解决办法
1万
查看次数

为什么VB中的lambda表达式与C#不同?

我刚刚遇到NHibernate中的一个错误,该错误恰好已经被提出:https: //nhibernate.jira.com/browse/NH-2763

我不确定这是否适用于枚举以外的任何其他内容,但是当使用VB中的Lambda时,它看起来与C#中的相同Lambda不同.

C#:

Where(x => x.Status == EmployeeStatus.Active)
Run Code Online (Sandbox Code Playgroud)

VB

Where(Function(x) x.Status = EmployeeStatus.Active)
Run Code Online (Sandbox Code Playgroud)

就我所知,它们是一样的吗?(我的VB不是很好)

如果我在同一行代码上放置一个断点,那么上面的代码将被传入.在C#我得到:

C#版本

在VB版本传入的同一行,我得到:

VB版

这是我做错了吗?结果是否相同,只是在C#/ VB之间显示不同?

编辑: 好的,所以它们显示不同,但它们不能相同,因为NHibernate无法处理它.NHibernate完全处理了C#版本,VB版本在抛出以下异常时解析:

例外

NHibernate StackTrace:

   at NHibernate.Impl.ExpressionProcessor.FindMemberExpression(Expression expression) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\ExpressionProcessor.cs:line 168
   at NHibernate.Impl.ExpressionProcessor.ProcessSimpleExpression(Expression left, Expression right, ExpressionType nodeType) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\ExpressionProcessor.cs:line 323
   at NHibernate.Impl.ExpressionProcessor.ProcessSimpleExpression(BinaryExpression be) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\ExpressionProcessor.cs:line 316
   at NHibernate.Impl.ExpressionProcessor.ProcessBinaryExpression(BinaryExpression expression) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\ExpressionProcessor.cs:line 418
   at NHibernate.Impl.ExpressionProcessor.ProcessExpression(Expression expression) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\ExpressionProcessor.cs:line 486
   at NHibernate.Impl.ExpressionProcessor.ProcessExpression[T](Expression`1 expression) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\ExpressionProcessor.cs:line 504
   at NHibernate.Criterion.QueryOver`2.Add(Expression`1 expression) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Criterion\QueryOver.cs:line 635
   at NHibernate.Criterion.QueryOver`2.NHibernate.IQueryOver<TRoot,TSubType>.Where(Expression`1 expression) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Criterion\QueryOver.cs:line 686
   at *removed*.EmployeeRepository.GetByEntityId(Int64 entityId, …
Run Code Online (Sandbox Code Playgroud)

c# vb.net lambda

11
推荐指数
2
解决办法
1025
查看次数

标签 统计

c# ×2

lambda ×2

expression ×1

vb.net ×1