C# C-需要帮助了解Lambda操作和
我目前正在进行一个项目,需要一个方法来获取变量的名称。XmlNode类型。我找到了这个解决方案,但我不知道它是如何工作的。任何解释都会有帮助。谢谢大家!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).
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)`