如何使用反射将IList动态转换为任意数据类型的数组

Muhayyuddin Gillani
class myClass1
{
    public string obj1;
    public string obj2;

}
class myClass2
{
    public myClass1[] fArray = new myClass1[1];
    public string str;
}
class Program
{
    static void Main(string[] args)
    {
        string mytype = "ConsoleApp3.myClass2";
        Type type = Type.GetType(mytype);
        object myObj = Activator.CreateInstance(type);
        FieldInfo fi = type.GetField("fArray");
        Type type2 = fi.FieldType.GetElementType();
        object newObj;
        IList list = (IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(fi.GetValue(myObj).GetType().GetElementType()));
        {
            newObj = Activator.CreateInstance(type2);
            FieldInfo fi2 = type2.GetField("obj1");
            fi2.SetValue(newObj, "some txt1");
            FieldInfo fi3 = type2.GetField("obj2");
            fi3.SetValue(newObj, "some txt2");
            list.Add(newObj);
        }

        {
            newObj = Activator.CreateInstance(type2);
            FieldInfo fi2 = type2.GetField("obj1");
            fi2.SetValue(newObj, "some txt1");
            FieldInfo fi3 = type2.GetField("obj2");
            fi3.SetValue(newObj, "some txt2");
            list.Add(newObj);

        }

        fi.SetValue(myObj, list.Cast<myClass1>().ToArray());

上面的代码工作正常。在我的用例中,在编译时不知道“ myClass1”。我在运行时以字符串形式接收myClass1的类型。

如何使用反射将列表转换为myClass1类型的数组?

        fi.SetValue(myObj, list.Cast<???>().ToArray());
银心

您也可以创建通用方法:

让我们为元素类型创建一个局部变量,以便我们可以重用它。

var elementType = fi.GetValue(myObj).GetType().GetElementType();
...

从linq可枚举类中获取cast方法和array方法。

var castMethod = typeof(System.Linq.Enumerable).GetMethod("Cast").MakeGenericMethod(elementType);
var arrayMethod = typeof(System.Linq.Enumerable).GetMethod("ToArray").MakeGenericMethod(elementType);

以null作为静态方法的第一个参数调用方法。

var casted = castMethod.Invoke(null, new[] { list });
var array = arrayMethod.Invoke(null, new[] { casted });
fi.SetValue(myObj, array);

这样做可能会有更聪明的方法,但这可能会让您入门。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用反射将运行时类型A:IList <AT>的集合转换为类型B:IList <BT>的新集合?

如何将Mobus数据数组的数据类型转换为REAL数据类型

如何在c#中动态地将值转换为数据类型?

如何将所有列数据类型动态转换为数字和字符?

如何将JSON中的数组转换为控制器可以处理的数据类型

如何将numpy数组转换为tensorflow可以分类的数据类型?

如何将Date数据类型转换为整数?

如何将NSInteger转换为NSString数据类型?

如何将 PyObjects 转换为 C 数据类型?

如何将 nvarchar 数据类型转换为数字

使用反射转换为数组类型

使用保留的数据类型将DataGridView转换为XML

如何使用dart:ffi将Uint8List转换为C等效数据类型

将Import-CSV结果从字符串转换为任意数据类型

如何将未知类型(类型在运行时已知)的 IList 转换为数组?

在构建动态查询时,显示将数据类型 varchar 转换为 float 的错误 - 如何解决?

R - 将数据框中所有列的数据类型从字符动态转换为数字

如何将对象类型的实例“动态”转换为其特定数据类型?

使用 to_html 将数据帧转换为 HTML 时,如何更改数据帧的数据类型?

如何将自定义数据类型转换为数组数组

如何使用python在SQL Server中将字符串数据类型类型的行转换为XML数据类型

将Oracle数据类型转换为SQLAlchemy类型

如何将* uint64和* uint32数据类型转换为int数据类型?

将float32数据类型的numpy数组转换为十六进制格式

将数据类型TYPE_4BYTE_ABGR的字节数组转换为BufferedImage

Haskell:如何将数据类型转换为其特定类型类之一?

如何将JSON数据类型转换为匹配的C#类型

如何调试“将varchar值X转换为数据类型int时转换失败”?

如何将 MPI_BCast 与自己的数据类型对象的动态数组一起使用