我從方法中取回對象。該對象是對象類型的,並且由於向後兼容性,我無法更改此對象。如果它屬於某種類型(Response<T>
波紋管),那麼我需要訪問類型爲T
的屬性Payload
,以便我可以將其作爲另一個對象的一部分序列化併發送出去。問題是因爲我不知道T
的類型,所以即使我不關心它的類型,我也不能將對象轉換成Response<T>
來訪問Payload
。Cast通用參數
這是我與通用類型的對象:
public class Response
{
public int Status { get; set; }
public string Message { get; set; }
}
public class Response<T> : Response
{
public T Payload { get; set; }
}
這裏是我想要做什麼:
// Will sometimes be of type Response<T>
object data = LegacyCode();
if (data.GetType().IsGenericType && data.GetType().GetGenericTypeDefinition() == typeof(Response<>)) {
var payload = ((Response<object>)data).Payload; // Unable to cast object of type...
}
但我能找到這樣做的唯一方法是通過使用動態。
// Will sometimes be of type Response<T>
object data = LegacyCode();
if (data.GetType().IsGenericType && data.GetType().GetGenericTypeDefinition() == typeof(Response<>)) {
var payload = ((dynamice)data).Payload;
}
不要問爲什麼事情是他們的方式(我想知道我自己)。我必須做代碼體操來保持這個系統的向後兼容性。 我只想編譯時檢查屬性的名稱。
這裏是一個小提琴:https://dotnetfiddle.net/dXxHbD
UPDATE:
我需要能夠序列化和反序列化這個對象。原本Response
有類型的屬性Payload
。當Response<T>
被反序列化時,這導致序列化問題,因爲Payload
屬性的類型爲Newtonsoft.Json.Linq.JObject
,無法將其轉換爲T
。這裏有一個例子:https://dotnetfiddle.net/uc15HD
的問題是,我是走錯了方向和反序列化工作,如果我投T
到object
,而不是試圖投object
到T
。當我將該值存儲爲其特定類型T
時,序列化程序知道要將字符串反序列化到什麼位置。 下面是使用下面的喬恩的回答一個例子:https://dotnetfiddle.net/KwudAx
下面是一個使用類似的例子使用的協方差的馬蒂亞斯的解決方案:https://dotnetfiddle.net/kCjZr4
這真的不清楚你想要做什麼......是'data'意味着是一個'Type',而不是類型的實例?這就是你所調用的內容的樣子,但是你試圖將它轉換爲「響應'...... –
並且你可以根據需要更改」響應「嗎?有一個非通用的抽象基類型? –
對不起。數據是一種類型的實例。它有時會是類型響應。我無法真正改變它是「有時」的。但是我需要特別處理它。 –
bygrace