Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.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# C-需要帮助了解Lambda操作和_C#_Lambda - Fatal编程技术网

C# C-需要帮助了解Lambda操作和

C# C-需要帮助了解Lambda操作和,c#,lambda,C#,Lambda,我目前正在进行一个项目,需要一个方法来获取变量的名称。XmlNode类型。我找到了这个解决方案,但我不知道它是如何工作的。任何解释都会有帮助。谢谢大家! static void Main(string[] args) { GetName(new { var1 }); GetName2(() => var1); } static string GetName<T>(T item) where T : class { return typeof(T).

我目前正在进行一个项目,需要一个方法来获取变量的名称。XmlNode类型。我找到了这个解决方案,但我不知道它是如何工作的。任何解释都会有帮助。谢谢大家!

static void Main(string[] args) 
{
    GetName(new { var1 });
    GetName2(() => var1);
}

static string GetName<T>(T item) where T : class 
{
    return typeof(T).GetProperties()[0].Name;
}

static string GetName2<T>(Expression<Func<T>> expr) 
{
    return ((MemberExpression)expr.Body).Member.Name;
}
特别是,我不明白为什么在调用方法时参数是new{var1}和=>var1,t:class意味着什么,expr意味着什么

我确实读过关于lambda手术的书,但那并没有多大帮助

new{var1}创建一个匿名对象 =>var1是一个lambda函数,没有以下参数的简写: 委托无效{return var1;} T项,其中T:class是反射并约束泛型 类的参数。见黑色怪圈42答案 首先,操作员的名字是在c 6中引入的。它可以做你想做的事。您可以这样使用它:

var myVariable = new Object();
var myVariableName = nameof(myVariable);
static string GetName3(object item)
{
    return item.GetType().GetProperties()[0].Name;
}
现在来解开你的问题

什么是新的{var1}

这里调用的是GetName方法。该方法只接受一个参数。本例中传递给方法的对象用以下代码实例化:new{var1}。这里新的{var1}正在创建一个。正在创建的对象有一个名为“var1”的属性,其值为变量var1。由于未提供属性名称,因此会自动为该属性指定与变量相同的名称。当您像这样声明匿名类型时,可以显式地命名该属性:new{var1=var1}。或者您可以为属性指定一个完全不同的名称:new{DifferentName=var1},但这会导致GetName返回错误的结果-请参见下面的内容。如果将这些类型显式定义为类,它们将分别如下所示:

public class  MyClass<T>
{
    public MyClass(T property)
    {
        var1 = property;
    }
    public var1 { get; }
}
也许作者试图通过消除传递给方法的一整类没有属性的对象-值类型,来利用至少一点点编译时检查

什么是=>var1

这是一个很好的例子。这个特定的表达式表示一个不接受参数并返回对象的函数。我从GetName2的方法签名中知道:

请参阅,expr参数是Func类型的表达式。该函数不接受任何参数,并返回类型为T的on对象

GetName2Expression expr是如何工作的


嗯。。。简短且可能不太准确的答案是,它返回表达式的右侧。所以你传入=>var1,然后返回var1。现在我们就到此为止。

对于问题的整个部分,请阅读以下内容:最好的部分是,这些方法都无法获得变量名称。@CamiloTerevinto我刚刚运行了代码,我自己定义了var1并得到了它。@fably:在第一次调用中初始化var1=0也很有效&我同意他们确实得到了名称。第一个方法给出了在匿名对象中定义的属性的名称,第二个方法给出了表达式树成员的名称。因此,在这两种情况下,您都需要包装变量以获取其名称,因此,它们不会提供变量的名称。delegate void{return var1;}不是创建委托或匿名方法的有效语法。此外,所讨论的lambda不是创建委托,而是创建表达式对象。泛型约束未使用反射。具有泛型约束的方法碰巧在其中使用反射,但这是非常不同的。
static string GetName3(object item)
{
    return item.GetType().GetProperties()[0].Name;
}
GetName2<T>(Expression<Func<T>> expr)`