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,我现在知道没有其他方法了,真是太遗憾了。。。我想知道这是否是一个设计上的选择,如果是这样,为什么。。。