C# 无法使用具有Lambda的扩展方法访问实例变量
我已经根据答案创建了一个扩展方法C# 无法使用具有Lambda的扩展方法访问实例变量,c#,linq,lambda,extension-methods,C#,Linq,Lambda,Extension Methods,我已经根据答案创建了一个扩展方法 编辑-更新以包括对基类以及继承它的基类进行操作的要求。如下更改扩展方法的签名:(删除初始“AcObject”) 您包含的那些类型参数(AcObject和tpProperty)是占位符,表示您在调用该方法时指定的实际类型。通过将方法中的第一个命名为“AcObject”,您隐藏了实际的类,也称为“AcObject”(因此此AcObject source中的“AcObject”不再引用您的类) 根据问题的更新,修改签名如下。一开始基本上是正确的,只需将类型参数的名称
编辑-更新以包括对基类以及继承它的基类进行操作的要求。如下更改扩展方法的签名:(删除初始“AcObject”) 您包含的那些类型参数(AcObject和tpProperty)是占位符,表示您在调用该方法时指定的实际类型。通过将方法中的第一个命名为“AcObject”,您隐藏了实际的类,也称为“AcObject”(因此
此AcObject source
中的“AcObject”不再引用您的类)
根据问题的更新,修改签名如下。一开始基本上是正确的,只需将类型参数的名称从“AcObject”更改为其他非类名的名称,如“T”:
更改扩展方法的签名如下:(删除初始的“AcObject”) 您包含的那些类型参数(AcObject和tpProperty)是占位符,表示您在调用该方法时指定的实际类型。通过将方法中的第一个命名为“AcObject”,您隐藏了实际的类,也称为“AcObject”(因此
此AcObject source
中的“AcObject”不再引用您的类)
根据问题的更新,修改签名如下。一开始基本上是正确的,只需将类型参数的名称从“AcObject”更改为其他非类名的名称,如“T”: 用法:
AcObject myObject = new AcObject();
myObject.GetValidationList();
用法:
AcObject myObject = new AcObject();
myObject.GetValidationList();
最好能解释一下OP为什么需要更改签名。看起来他误解了类型参数的概念。正如@Dennis提到的,我想我在这里误解了一些东西。如果我像您提到的那样进行上述更改,那么它对于任何显式地
AcObject
的对象都可以正常工作,但是对于继承AcObject
的对象就失败了。我将修改我的OP以包括一个示例。明确地说,“fails”是指它只列出我的lamda表达式中a对象的属性,而不是当前类型的属性<代码>公共类AcAsset:AcObject{…}
thenAcAsset asset asset=new AcAsset().GetValidationList(a=>a.
这里只列出了a对象的成员
最好解释一下,为什么OP需要更改签名。看起来他误解了类型参数的概念。正如@Dennis所提到的,我想我在这里误解了一些东西。如果我像你提到的那样进行上述更改,那么它对任何e对象都可以正常工作明明白白地AcObject
但是继承了AcObject
的东西失败了。我将修改我的OP以包括一个例子。说得清楚一点,我说的“失败”是指它在我的lamda表达式中只列出了AcObject
的属性,而不是当前类型的属性。公共类AcAsset:AcObject{…}
thenAcAsset asset=new AcAsset().GetValidationList(a=>a.
这里它只列出AcObject
的成员,感谢您的提示性回答,但我正在寻找包含lamda表达式的内容。感谢您的提示性回答,但我也在寻找包含lamda表达式的内容。
public static Dictionary<string, string> GetValidationList<TProperty>(
this AcObject source, Expression<Func<AcObject, TProperty>> propertyLambda)
AcObject myObject = new AcObject();
myObject.GetValidationList(a => a.Type); // call the extension method on the instance
public static Dictionary<string, string> GetValidationList<T, TProperty>(
this T source, Expression<Func<T, TProperty>> propertyLambda)
AcObject myObject = new AcObject();
myObject.GetValidationList(a => a.Id);
OtherObject myOtherObject = new OtherObject();
myOtherObject.GetValidationList(a => a.AssetTag);
public static class stat
{
public static void GetValidationList( this AcObject source )
{
Console.WriteLine(source.Id);
}
}
public class AcObject
{
public int Id { get; set; }
}
AcObject myObject = new AcObject();
myObject.GetValidationList();