Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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# 无法使用具有Lambda的扩展方法访问实例变量_C#_Linq_Lambda_Extension Methods - Fatal编程技术网

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{…}
then
AcAsset asset asset=new AcAsset().GetValidationList(a=>a.
这里只列出了
a对象的成员
最好解释一下,为什么OP需要更改签名。看起来他误解了类型参数的概念。正如@Dennis所提到的,我想我在这里误解了一些东西。如果我像你提到的那样进行上述更改,那么它对任何e对象都可以正常工作明明白白地
AcObject
但是继承了
AcObject
的东西失败了。我将修改我的OP以包括一个例子。说得清楚一点,我说的“失败”是指它在我的lamda表达式中只列出了
AcObject
的属性,而不是当前类型的属性。
公共类AcAsset:AcObject{…}
then
AcAsset 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();