如何在运行时设置通用Patameter T.

时间:2017-10-27 11:39:23

标签: c# generics json.net

我正在使用自定义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)>

我需要获取属性,界面成员。

我该怎么做?

1 个答案:

答案 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 });