我已經創建了一個擴展方法爲每一個答案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
}
任何人都可以向我解釋爲什麼我不能用source.Id
在上述情況下,並建議在哪裏我可以看到一個類似的解決方案?
如果我在GetValidationList()
方法內設置了一個斷點,我可以將鼠標懸停在源代碼上並查看它的屬性,就像我期望的那樣......我不能在VS中使用它。
我的總體目標是能夠做到以下
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);
}
編輯 - 更新,包括它的基類的工作,以及那些繼承它的要求。
這將是巨大的前很簡單,爲什麼OP需要更改簽名。看起來他誤解了類型參數的概念。 – Dennis 2014-09-24 05:28:41
正如@丹尼斯提到的,我認爲我在這裏誤解了一些東西。如果我如上所述進行上述更改,那麼對於顯式爲'AcObject'的任何對象都適用,但對於繼承'AcObject'的某些對象失敗。我會修改我的OP來包含一個例子。 – 2014-09-24 05:33:00
要明確,通過「失敗」,我的意思是它只在我的lamda expresion中列出了'AcObject'的屬性,而不是當前類型的屬性。 '公共類AcAsset:AcObject {...}'然後'AcAsset asset = new AcAsset()。GetValidationList(a => a。'在這裏它只列出'AcObject'的成員 – 2014-09-24 05:38:53