我正在使用自定义的JsonConverter。我需要获取对象的类型并设置为通用参数。
public class PagedResultConverter : Newtonsoft.Json.JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var pagedList = (IPagedList<T>)value;
var jsonJObject = new JObject
{
{"TotalCount", pagedList.TotalCount}
}
jsonJObject.WriteTo(writer);
}
}
我的IPagedList<T>
参数T
将是typeof(value)
类型,但我无法设置IPagedList<typeof(value)>
我需要获取属性,接口成员。
我该怎么做?
正如我在注释中已经提到的,你不能指望编译器推断你在运行时提供的类型。也就是说,当您仅在执行程序时才知道实际类型时,编译器如何事先为您提供有关pagedList
的正确信息?
也许你可以引入一个 nin 泛型接口,你的泛型接口继承自:
interface IPagedList { int TotalCount { get; set; } }
interface IPagedList<T> : IPagedList { ... }
现在,您可以将反序列化实例强制转换为非泛型接口:
var pagedList = (IPagedList)value;
但是,为什么不将WriteJson
方法设为通用并通过反射提供类型:
public override void WriteJson<T>(JsonWriter writer, Tvalue, JsonSerializer serializer)
{
var pagedList = (IPagedList<T>)value;
}
var obj = ...
var m = typeof(MyClass).GetMethod("WriteJson").MakeGenericMethod(obj.GetType());
m.Invoke(instanceOfMyClass, new object[] { myWriter, obj, myerializer });