Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取Func的参数<;T>;变量_C#_Dynamic_Lambda_Expression Trees_Func - Fatal编程技术网

C# 获取Func的参数<;T>;变量

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)

我有一个相当复杂的问题。我试图从一个方法及其形式和实际参数中获得一个唯一的键。该方法的目标是进行方法调用,并根据1)类和方法的名称以及2)调用该方法的参数的名称和值返回唯一键

方法看起来是这样的(对于所有的细节,我很抱歉,但是我找不到一个合理的方法来缩小示例,但仍然可以解释我的问题)

Dummy
class
SayHello
方法定义很简单:

 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");