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



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

相关内容

  • 没有找到相关文章

最新更新