尷尬的標題我知道,最好在代碼中解釋。給定一組類:鑑於一個受限制的泛型方法,我可以調用一個非泛型方法來傳遞泛型參數的實際類型。
public abstract class MyBaseType
{
public string Message { get; set; }
}
public class MySuperType : MyBaseType
{
public string AdditionalInfo { get; set; }
}
public class MyOtherSuperType : MyBaseType
{
public DateTime Started { get; set; }
public DateTime Finished { get; set; }
}
有沒有編寫調用傳遞泛型類型,而解釋傳遞類型爲實際類型而不是基本類型非泛型方法泛型方法的一種方式。也就是說,我想向寫的是這樣的:因爲T被解釋爲基本型
public void OutputFormattedTypeInfo<T>(T theType) where T : MyBaseType
{
OutputFormattedTypeInfo(theType as T);
}
public void OutputFormattedTypeInfo(MySuperType theType)
{
System.Console.WriteLine(String.Format("{0} and {1}", theType.Message, theType.AdditionalInfo));
}
public void OutputFormattedTypeInfo(MyOtherSuperType theType)
{
System.Console.WriteLine(String.Format("{0} - Start: {1}, End: {2}", theType.Message, theType.Started, theType.Finished));
}
但顯然theType。我知道我可以用這樣的反思:
Type type = typeof(MyBaseTypeDisplayFormatter);
MethodInfo method = type.GetMethod(
"FormatSpecific",
BindingFlags.Instance | BindingFlags.NonPublic,
null,
new[] { update.GetType() },
null);
return (MyBaseTypeDataItem)method.Invoke(this, new object[] { update });
但它只是感覺不雅。有沒有更好的辦法?
-1這將始終與調用基類的重載的方法,從來沒有專門的班級。 – 2011-04-15 12:22:10
你錯了我的朋友。如果你通過一隻長頸鹿,並且你有長頸鹿和動物的重載,它將使用正確的過載。 – Aliostad 2011-04-15 12:23:28
是的,但是如果你正在處理它們的集合,比如說IEnumerable,那麼它將成爲動物,無論是長頸鹿還是袋熊。但是,對於具有正確派生類型的單個T,您是正確的。 –
2011-04-15 12:36:28