C# 获取Func的参数<;T>;变量
我有一个相当复杂的问题。我试图从一个方法及其形式和实际参数中获得一个唯一的键。该方法的目标是进行方法调用,并根据1)类和方法的名称以及2)调用该方法的参数的名称和值返回唯一键 方法看起来是这样的(对于所有的细节,我很抱歉,但是我找不到一个合理的方法来缩小示例,但仍然可以解释我的问题)C# 获取Func的参数<;T>;变量,c#,dynamic,lambda,expression-trees,func,C#,Dynamic,Lambda,Expression Trees,Func,我有一个相当复杂的问题。我试图从一个方法及其形式和实际参数中获得一个唯一的键。该方法的目标是进行方法调用,并根据1)类和方法的名称以及2)调用该方法的参数的名称和值返回唯一键 方法看起来是这样的(对于所有的细节,我很抱歉,但是我找不到一个合理的方法来缩小示例,但仍然可以解释我的问题) DummyclassSayHello方法定义很简单: public class DummyObject { public string SayHello(string name)
Dummy
classSayHello
方法定义很简单:
public class DummyObject
{
public string SayHello(string name)
{
return "Hello " + name;
}
public string Meet(string person1, string person2 )
{
return person1 + " met " + person2;
}
}
我有两个问题:
间接
发送到MethodKey.GetKey
,并将其作为MethodCallExpression
类型获取MemberExpression
,如何获得提供的方法的名称和值?我在代码的“else”部分尝试了一些位,但没有成功李>
感谢您的帮助
提前感谢,很抱歉发了这么长的帖子。问题是您将其放入了错误类型的变量中。您的方法需要
Expression
,您正在使用Func
类型的变量来存储它。以下内容可以解决您的问题:
Expression<Func<string>> foo = () => dummy.SayHello("Jens");
var actual = MethodKey.GetKey<string>(foo, "name");
Expression foo=()=>dummy.SayHello(“Jens”);
var-actual=MethodKey.GetKey(foo,“name”);
讨论Func
和表达式
之间的区别,以及二者之间的转换,一目了然,它说不。编译器将它们变成完全不同的东西。因此,在编译时使它成为正确的东西,它应该工作得很好
如果这不是一个选项,那么接受Func而不是表达式的重载可能适合您
请注意,在这两种情况下,我都会直接传递变量,而不是在调用中尝试将其转换为新表达式。
Func
表示输入参数为零的函数。如果将参数类型更改为Func
或Func
或类似类型,是否会看到参数类型的更改?非常感谢。我不知道表达式和函数实际上被编译成不同的东西。很高兴知道。因此,如果我想要包装器方法,它们都获得方法和参数的名称,并使用参数调用它,那么我需要将它分成两部分,一部分使用Func参数,另一部分使用表达式1。我想我需要再次学习“ANSI通用Lisp”。。。
[Test]
public void GetKey_Works_With_func_variable()
{
const string expectedScope = "MethodNameTests.DummyObject";
var expected = expectedScope + "¤" + "SayHello" + "¤" + MethodKey.Flatten(new Dictionary<string, string>() { { "name", "Jens" } });
var dummy = new DummyObject();
Func<string> indirection = (() => dummy.SayHello("Jens"));
// This fails. I would like to do the following, but the compiler
// doesn't agree :)
// var actual = MethodKey.GetKey(indirection, "name");
var actual = MethodKey.GetKey(() => indirection, "name");
Assert.That(actual, Is.Not.Null);
Assert.That(actual, Is.EqualTo(expected));
}
public class DummyObject
{
public string SayHello(string name)
{
return "Hello " + name;
}
public string Meet(string person1, string person2 )
{
return person1 + " met " + person2;
}
}
Expression<Func<string>> foo = () => dummy.SayHello("Jens");
var actual = MethodKey.GetKey<string>(foo, "name");