我正在使用自定义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)>
我需要获取属性,界面成员。
我该怎么做?
答案 0 :(得分:0)
正如我在评论中已经提到的,您不能指望编译器推断您在运行时中提供的类型。那就是只有在执行程序时才知道实际类型,编译器如何预先在pagedList
上为您提供正确的信息?
也许你可以引入你的通用接口继承的nin-generic接口:
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 });