为通用类型创建JavascriptConverter

时间:2011-12-01 12:02:29

标签: c# asp.net-mvc serialization

假设我有一个名为MyClass<T>的泛型类,我如何创建一个JavascriptConverter,用于任何可能的T(MyClass<OtherClass>MyClass<SimpleClass>)?

我在转换器中尝试了以下内容:

public Enumerable<Type> SupportedTypes
{
  get
  {
    return new List<Type>(){ typeof(MyClass<>) };
  }
}

但无济于事。

有什么想法吗?这可能吗?
如果没有,是否有其他方法可以获得相同的结果?

3 个答案:

答案 0 :(得分:0)

如果你真的想要这个,完全没有过滤器:

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();

它获取所有已加载的程序集,然后是这些程序集的所有类型,然后根据您的通用条件筛选条件,最后它从您的类和类型中生成具体的泛型类型。

答案 1 :(得分:0)

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

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;
    }
}

答案 2 :(得分:-1)

据我所知,由于javascript是松散类型的,因此将某些内容作为通用参数并不是一个问题。
但是,您可以尝试使用instanceof进行测试。 检查这个问题:
What is the instanceof operator in JavaScript?
它可以满足您的需求,至少是检查类型部分。