给出以下功能;
void SomeFunction<T>(...){
SomeOtherFunction<T>();
}
这很好用,但有时函数在T传递之前失败是一个数组类型,但它不能是数组类型。这些函数与字典的JSON反序列化有关,但由于某种原因,当字典只有一个条目时,它不接受T数组参数。
简而言之,我想这样做
void SomeFunction<T>(...){
try {
SomeOtherFunction<T>();
} catch ( Exception e ){
SomeOtherFunction<T arrayless>();
}
}
我已经尝试了很多东西,我意识到真正的问题是在其他地方,但我需要临时解决这个问题,这样我才能在解串器中找到真正的解决方案。我也尝试使用以下方法进行反射;
MethodInfo method = typeof(JToken).GetMethod("ToObject", System.Type.EmptyTypes);
MethodInfo generic = method.MakeGenericMethod(typeof(T).GetElementType().GetGenericTypeDefinition());
object result = generic.Invoke(valueToken, null);
但这也不太有用。
谢谢!
答案 0 :(得分:1)
我不确定你要在这里实现什么,但要获得数组中元素的类型,你必须使用Type.GetElementType()
:
void SomeFunction<T>()
{
var type = typeof(T);
if(type.IsArray)
{
var elementType = type.GetElementType();
var method = typeof(Foo).GetMethod("SomeOtherFunction")
.MakeGenericMethod(elementType);
// invoke method
}
else
foo.SomeOtherFunction<T>(...);
}
答案 1 :(得分:0)
如果我正确地按照你的意思,你想根据对象的类型是否是一个数组来调用两个泛型函数中的一个。
怎么样:
if (typeof(T).ImplementsInterface(typeof(IEnumerable)))
someFunction<T>();
else
someOtherFunction<T>();