我有一個帶有字串屬性名稱和 T 屬性值的型別別。我收到一個具有不同屬性的 Json 物件,其中兩個是名稱和值。
我正在通過反射創建型別(在示例中我明確創建了一個布林值),并且我需要將接收到的字串值分配給可以是任何型別的 Type.Value 屬性。
我怎樣才能做到這一點 ?型別可以是 int string、List(任何已知型別)或我創建的新型別。我不想切換接收到的字串型別名稱來創建特定的值型別。我想要一種通用的方法來避免每次在系統中創建新型別時都更新此方法。如果我使用反射創建 Type 類實體,我還想在不知道型別的情況下在運行時更新 value 屬性。
我的代碼不處理反序列化(這發生在我無權訪問的其他代碼中。即使使用訪問,進行反序列化的專案也無法識別自定義型別,因為它是常見的/util 專案。所以在這種情況下,我只需要專注于將字串值轉換為 T 值。
public class Type<T>
{
public string Name { get; set; }
public Type Type => typeof(T)
public T Value { get; set; }
}
public MyResultObject
{
public string ReqId { get; set; }
public string Name { get; set; }
public string Value { get; set; }
}
var jsonResult = myResultObject //type of MyResultObject
var type = new type<bool>(); //in my code this is created with reflection
type.Name = jsonResult.Name;
type.Value = jsonResult.Value as bool ??? //I want to convert the string Value to the explicit type that can be any T type
uj5u.com熱心網友回復:
您的示例沒有很好地證明這個問題。如果你知道<T>的Type<T>只是在你添加一個方法Type<T>類,通過不決議JsonConvert從NewtonsoftJson或JsonSerializer從System.Text.Json和問題將得到解決。我在這里錯過了什么嗎?
public class Type<T>
{
public string Name { get; set; }
public Type GenericType => typeof(T);
public T Value { get; set; }
public void SetValueFromString(string value)
{
Value = JsonConvert.DeserializeObject<T>(value);
}
}
uj5u.com熱心網友回復:
最好的方法取決于你沒有包括的細節。
如果您在反序列化時不知道型別,但您在代碼中稍后知道該型別,則一種解決方案可能是將 Value 屬性保留為 JToken,然后在您的代碼知道它需要什么型別:
public MyResultObject
{
public string ReqId { get; set; }
public string Name { get; set; }
public JToken Value { get; set; }
}
type.Value = jsonResult.Value<bool>(); // or .Value<T>()
如果您需要將物件反序列化為正確的具體型別,但在編譯時不知道該型別可能是什么,那么 JSON.NET 有一個內置功能來處理此問題:TypeNameHandling。如果您使用這樣的序列化程式選項序列化和反序列化您的物件:
new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Auto
}
...然后您可以將您的Value屬性設定為 anobject并且 JSON.NET 會自動將型別元資料添加到序列化物件中,以便可以將其序列化為正確的型別。
不過,這種方法有兩個潛在的缺點。一是您必須同時控制序列化和反序列化。另一個是,如果您不信任的人提供 JSON,則可能存在安全隱患:他們可以實體化一些您不希望他們能夠創建的隨機物件型別。
有一種中間方法,您可以使用自定義型別轉換器根據 JSON 物件上其他內容的值來確定要創建的物件型別,但是您可以更好地控制可能創建的物件型別以及如何創建在 JSON 中表示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/409443.html
標籤:
上一篇:根據日期范圍查找確切的周數
