【发布时间】:2015-02-20 19:07:32
【问题描述】:
我想要做的是没有泛型类型很简单。
SomeType[] s = new SomeType[5];
for(int i = 0; i < 5: i++){
s[i]= new SomeType();
}
使用泛型这是我目前所拥有的。
private static T TypeMapper<T>(dynamic handle) {
if (typeof(T).IsArray)
{
Type elementType = typeof(T).GetElementType();
int arrayLength = handle.Length;
Array array = Array.CreateInstance(elementType, arrayLength);
//??? How to get the type of an generic array element
Type typeOfthis = typeof(array[0]).GetElementType();
for (int i = 0; i < arrayLength; i++)
{
//??? How to create an instance from it.
array[i] = new typeOfthis ();
}
T obj = (T)(object)array;
return obj;
}
else
{}
然后调用TypeMapper函数。
dynamic t = new TextSpan[4];
var result = TypeMapper<TextSpan[]>(t)
如何获取泛型数组元素的类型。
Type typeOfthis = typeof(array[0]).GetElementType();//Not Working
以及如何从中创建实例。
array[i] = new typeOfthis ();
非常感谢您的帮助。
铷 37 的溶液被标记为正确
Type typeofitem = array.GetType().GetElementType();
而不是
Type typeOfthis = typeof(array[0]).GetElementType();
和
array.SetValue(Activator.CreateInstance(typeofitem), i);
而不是
array[i] = new typeOfthis ();
也感谢这里的其他解决方案,但他们完全忽略了我可以将 SomeType[] 或 SomeType 作为 T 传递给 TypeMapper<T>(dynamic handle) 的点。
然后我可以从该类型派生它是否是一个数组,并根据需要处理句柄。
题外话
其背后的长呼吸原因是编组来自 v8 的 javascript 类型,该类型由 v8dotnet 包装器使用,该包装器返回具有与动态对象一样的行为的对象。我没有解释InternalHandle handle 是什么,而是将其简化为动态的,以便它易于理解。
【问题讨论】:
-
天啊。从哪儿开始。你到底想做什么?您已经提出了您的(无效的)解决方案,但是您的问题是什么?这看起来确实是一个错误的解决方案……嗯,几乎是任何问题。您只是在寻找
return Enumerable.Range(1, 5).Select(i => new T()).ToArray()吗?我看不出有任何理由在任何地方使用反射。 添加您的问题。 -
array[0]return element 所以array[0].GetType()足以获取元素类型
标签: c# reflection