[英]Method overloads object and unspecified type
我有以下方法過載:
public string GetName(object obj)
{
return obj.ToString();
}
public string GetName(CustomClass cc)
{
return cc.Name + " - " + cc.Description;
}
現在,如果我使用擁有CustomClass的無類型IEnumerable調用該方法,則將調用GetName(object obj)來解決此問題,我修改了如下方法:
public string GetName(object obj)
{
if (obj is CustomClass)
return GetName(obj as CustomClass);
return obj.ToString();
}
我認為編寫20條IF語句並捕獲所有其他可能性非常煩人,是否有一種更簡單的方法可以使用無類型的IEnumerable枚舉來調用正確的重載?
這是調用GetName(object obj)的代碼:
IEnumerable rawData = GetData(); //DataBase method that fetches a CustomClass
foreach (var rawDataItem in rawData)
{
Debug.Print(GetName(rawDataItem)); //calls the GetName(object obj) overload
}
請不要告訴我從CustomClass覆蓋ToString,幫助我解決此方法調用問題。
好吧,您可以使用動態類型 。 這基本上會將重載解析推遲到執行時間:
foreach (dynamic rawDataItem in rawData)
{
Debug.Print(GetName(rawDataItem));
}
請注意,這里可能存在性能成本-可能很小且無關緊要,但是值得注意。
編輯:要處理事情的遞歸方面,您可能想要兩個不同的名稱,例如GetName
和GetNameImpl
,其中GetName
委托給GetNameImpl
,這就是所有有用的重載都被調用的地方。 因此,您將擁有:
// Note that dynamic as a parameter type is equivalent to object for callers.
// The dynamic part is only relevant within the method.
public string GetName(dynamic obj)
{
return GetNameImpl(obj);
}
// Fallback when no other overloads match
private string GetNameImpl(object obj)
{
...
}
private string GetNameImpl(IEnumerable obj)
{
// Maybe build up the name by calling GetName on each element?
}
請注意,這存在一個潛在的問題:如果您對不同的接口有兩個重載,並且一個類型實現了兩個接口(但是該類型本身沒有特定的重載),那么在執行時會遇到異常。
如果希望調用者能夠直接調用重載,則可以將動態的一個重命名為GetNameDynamic
,而其他的重命名為GetName
(並將它們公開)。
我很少發現, dynamic
是一個很好的解決方案,但它會避免代碼重復。 我會嘗試退后一步,說實話,找到其他設計。 您在問題中明確拒絕了它,但是多態是處理此問題的首選方式。 您不必重寫ToString
您可以使所有自定義類型實現特定的接口,並在可用的情況下使用該接口。
return GetName((dynamic)obj);
將重載解析推遲到運行時。
嘗試這個:
public string GetName(object obj)
{
if (!(obj is IEnumerable<object>))
return GetName(obj as CustomClass);
return obj.ToString();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.