我知道网站上有一些答案,如果这有任何重复,我道歉,但我找到的所有答案都没有做我想做的事情.
我正在尝试指定方法信息,因此我可以通过不使用字符串以类型安全的方式获取名称.所以我试图用表达式提取它.
假设我想在此界面中获取方法的名称:
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)
但所有尝试都无法编译
有没有办法做到这一点?
我刚刚遇到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#我得到:

在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)