2014-09-24 144 views
1

我已經創建了一個擴展方法爲每一個答案on SO here無法與擴展方法來訪問實例變量和λ

public class AcObject 
{ 
    public int Id { get; set; } 
} 

public static Dictionary<string, string> GetValidationList<AcObject, TProperty>(
    this AcObject source, 
    Expression<Func<AcObject, TProperty>> propertyLambda) 
{ 
    // Autocomplete here only shows static members for 'source' 
    // I am expecting to be able to do source.Id 
} 

enter image description here

任何人都可以向我解釋爲什麼我不能用source.Id在上述情況下,並建議在哪裏我可以看到一個類似的解決方案?

如果我在GetValidationList()方法內設置了一個斷點,我可以將鼠標懸停在源代碼上並查看它的屬性,就像我期望的那樣......我不能在VS中使用它。

enter image description here

我的總體目標是能夠做到以下

public class AcObject 
{ 
    public int Id { get; set; } 
    public string Type { get; set; } 
} 

public class OtherObject : AcObject 
{ 
    public string AssetTag { get; set; } 
} 

// somewhere else in code 
AcObject myObject = new AcObject(); 
myObject.GetValidationList(a => a.Type); 

// Along with using the type that inherits it 
OtherObject myOtherObject = new OtherObject(); 
myOtherObject.GetValidationList(a => a.Type); 

// In some kind of extension method lambda magic 
{ 
    Console.WriteLine(source.Id); 
} 

編輯 - 更新,包括它的基類的工作,以及那些繼承它的要求。

回答

4

更改您的擴展方法的簽名如下:(刪除初始 「AcObject」)

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 

那些包含的類型參數(AcObject和TProperty)是佔位符,表示您在調用方法時指定的實際類型。通過在您的方法中命名第一個「AcObject」,您隱藏了也稱爲「AcObject」的實際類(因此this AcObject source中的「AcObject」不再引用您的類)。


鑑於您的問題的更新,請修改您的簽名。你基本上有它正確的開始,只是改變從「AcObject」類型參數的名稱別的,就是類的名稱,如「T」:

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); 
+0

這將是巨大的前很簡單,爲什麼OP需要更改簽名。看起來他誤解了類型參數的概念。 – Dennis 2014-09-24 05:28:41

+0

正如@丹尼斯提到的,我認爲我在這裏誤解了一些東西。如果我如上所述進行上述更改,那麼對於顯式爲'AcObject'的任何對象都適用,但對於繼承'AcObject'的某些對象失敗。我會修改我的OP來包含一個例子。 – 2014-09-24 05:33:00

+0

要明確,通過「失敗」,我的意思是它只在我的lamda expresion中列出了'AcObject'的屬性,而不是當前類型的屬性。 '公共類AcAsset:AcObject {...}'然後'AcAsset asset = new AcAsset()。GetValidationList(a => a。'在這裏它只列出'AcObject'的成員 – 2014-09-24 05:38:53

0
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(); 
+0

感謝您的及時答覆,但我正在尋找包含lamda表達式的內容。 – 2014-09-24 05:33:29