C# 为泛型类型创建JavascriptConverter

C# 为泛型类型创建JavascriptConverter,c#,asp.net-mvc,serialization,C#,Asp.net Mvc,Serialization,假设我有一个名为MyClass的泛型类,我如何创建一个JavascriptConverter,用于任何可能的(无论是MyClass,MyClass) 我尝试在转换器中执行以下操作: public Enumerable<Type> SupportedTypes { get { return new List<Type>(){ typeof(MyClass<>) }; } } 支持的公共可枚举类型 { 收到 { 返回新列表(){typeof(

假设我有一个名为
MyClass
的泛型类,我如何创建一个
JavascriptConverter
,用于任何可能的(无论是
MyClass
MyClass

我尝试在转换器中执行以下操作:

public Enumerable<Type> SupportedTypes
{
  get
  {
    return new List<Type>(){ typeof(MyClass<>) };
  }
}
支持的公共可枚举类型
{
收到
{
返回新列表(){typeof(MyClass)};
}
}
但是没有用

有什么想法吗?这可能吗?

如果没有,有没有其他方法可以获得相同的结果?

据我所知,由于javascript是松散类型的,因此不需要考虑使用泛型参数。
不过,您可以尝试使用instanceof进行测试。 检查此问题:


它可以满足您的需要,至少是检查类型部分。

如果您真的想这样做,则完全不需要过滤器:

using System.Linq;

....

var concreteGenericTypes =
    (from assembly in AppDomain.CurrentDomain.GetAssemblies()
     from T in assembly.GetTypes()
     where T.IsClass && T.GetConstructor(new Type[] { }) != null
     select typeof(MyClass<>).MakeGenericType(T)).ToList();
使用System.Linq;
....
var-concreteGenericTypes=
(来自AppDomain.CurrentDomain.GetAssemblys()中的程序集)
来自assembly.GetTypes()中的T
其中T.IsClass&&T.GetConstructor(新类型[]{})!=null
选择typeof(MyClass).MakeGenericType(T)).ToList();

它获取所有加载的程序集,然后获取这些程序集的所有类型,然后根据泛型where条件进行筛选,最后从类和类型生成具体的泛型类型。

如果您是泛型类型的作者,则应创建泛型类型继承自的接口。例如:

public interface IResultSet
{
    long TotalItems { get; }
    IEnumerable Items { get; }
}

public class ResultSet<T> : IResultSet, IEnumerable<T>
{
    private IEnumerable<T> _enumerable;
    private int _totalItems;

    public ResultSet(IEnumerable<T> enumerable,
                     int totalItems)
    {
        _enumerable = enumerable;
        _totalItems = totalItems;
    }

    public IEnumerable Items { get { return _enumerable; } }
    public long TotalItems { get{ return _totalItems; } }

    public IEnumerator<T> GetEnumerator()
    {
        return _enumerable.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return _enumerable.GetEnumerator();
    }
}

public class ResultSetConverter : JavaScriptConverter
{
    public override IEnumerable<Type> SupportedTypes
    {
        get
        {
            return new[] { typeof(IResultSet) };
        }
    }

    ...

    public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
    {
        if (!typeof(IResultSet).IsAssignableFrom(obj.GetType()))
        {
            return null;
        }

        var resultSet = obj as IResultSet;
        var json = new Dictionary<string, object>();

        json["totalItems"] = resultSet.TotalItems;
        json["items"] = resultSet.Items;

        return json;
    }
}
公共接口IResultSet
{
long TotalItems{get;}
IEnumerable项{get;}
}
公共类结果集:IResultSet,IEnumerable
{
私有IEnumerable enumerable;
私人综合项目;
公共结果集(IEnumerable enumerable,
整数(项目总数)
{
_可枚举=可枚举;
_totalItems=totalItems;
}
公共IEnumerable项{get{return}可枚举;}
公共长TotalItems{get{return}TotalItems;}
公共IEnumerator GetEnumerator()
{
返回_enumerable.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
返回_enumerable.GetEnumerator();
}
}
公共类结果转换器:JavaScriptConverter
{
公共覆盖IEnumerable SupportedTypes
{
收到
{
返回新的[]{typeof(IResultSet)};
}
}
...
公共重写IDictionary序列化(对象obj、JavaScriptSerializer序列化程序)
{
如果(!typeof(IResultSet).IsAssignableFrom(obj.GetType()))
{
返回null;
}
var resultSet=obj作为IResultSet;
var json=newdictionary();
json[“totalItems”]=resultSet.totalItems;
json[“items”]=resultSet.items;
返回json;
}
}

MyClass可能需要一个包含所有具体类型的列表(对
T
有任何限制吗?)。然后,任何回答者都不必查找
JavascriptConverter
是什么。问题是我一开始不知道可能的t的列表。对T的唯一限制是它是一个类,并且有一个默认的类。MyClass实例需要特殊(json)序列化,因此需要创建自定义序列化。这与javascript的松散类型行为没有直接关系…在JavaScriptSerializer上使用reflector,我现在知道没有其他方法了,真是太遗憾了。。。我想知道这是否是一个设计上的选择,如果是这样,为什么。。。