假设我有一个名为MyClass<T>
的泛型类,我如何创建一个JavascriptConverter
,用于任何可能的T(MyClass<OtherClass>
,MyClass<SimpleClass>
)?
我在转换器中尝试了以下内容:
public Enumerable<Type> SupportedTypes
{
get
{
return new List<Type>(){ typeof(MyClass<>) };
}
}
但无济于事。
有什么想法吗?这可能吗?
如果没有,是否有其他方法可以获得相同的结果?
答案 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?
它可以满足您的需求,至少是检查类型部分。