C# 如何使用反射将IList动态强制转换为任意数据类型的数组 类myClass1 { 公共字符串obj1; 公共字符串obj2; } 类别myClass2 { 公共myClass1[]fArray=新myClass1[1]; 公共字符串str; } 班级计划 { 静态void Main(字符串[]参数) { 字符串mytype=“ConsoleApp3.myClass2”; Type Type=Type.GetType(mytype); 对象myObj=Activator.CreateInstance(类型); FieldInfo fi=type.GetField(“fArray”); Type type2=fi.FieldType.GetElementType(); 对象newObj; IList list=(IList)Activator.CreateInstance(typeof(list).MakeGenericType(fi.GetValue(myObj.GetType().GetElementType()); { newObj=Activator.CreateInstance(类型2); FieldInfo fi2=type2.GetField(“obj1”); 图2.设置值(newObj,“一些txt1”); FieldInfo fi3=type2.GetField(“obj2”); 图3.设定值(newObj,“一些txt2”); 添加列表(newObj); } { newObj=Activator.CreateInstance(类型2); FieldInfo fi2=type2.GetField(“obj1”); 图2.设置值(newObj,“一些txt1”); FieldInfo fi3=type2.GetField(“obj2”); 图3.设定值(newObj,“一些txt2”); 添加列表(newObj); } fi.SetValue(myObj,list.Cast().ToArray());

C# 如何使用反射将IList动态强制转换为任意数据类型的数组 类myClass1 { 公共字符串obj1; 公共字符串obj2; } 类别myClass2 { 公共myClass1[]fArray=新myClass1[1]; 公共字符串str; } 班级计划 { 静态void Main(字符串[]参数) { 字符串mytype=“ConsoleApp3.myClass2”; Type Type=Type.GetType(mytype); 对象myObj=Activator.CreateInstance(类型); FieldInfo fi=type.GetField(“fArray”); Type type2=fi.FieldType.GetElementType(); 对象newObj; IList list=(IList)Activator.CreateInstance(typeof(list).MakeGenericType(fi.GetValue(myObj.GetType().GetElementType()); { newObj=Activator.CreateInstance(类型2); FieldInfo fi2=type2.GetField(“obj1”); 图2.设置值(newObj,“一些txt1”); FieldInfo fi3=type2.GetField(“obj2”); 图3.设定值(newObj,“一些txt2”); 添加列表(newObj); } { newObj=Activator.CreateInstance(类型2); FieldInfo fi2=type2.GetField(“obj1”); 图2.设置值(newObj,“一些txt1”); FieldInfo fi3=type2.GetField(“obj2”); 图3.设定值(newObj,“一些txt2”); 添加列表(newObj); } fi.SetValue(myObj,list.Cast().ToArray());,c#,system.reflection,C#,System.reflection,上面的代码运行良好。在我的用例中,“myClass1”在编译时是未知的。我在运行时以字符串形式接收myClass1的类型 如何使用反射将列表强制转换为myClass1类型的数组 class myClass1 { public string obj1; public string obj2; } class myClass2 { public myClass1[] fArray = new myClass1[1]; public string str; } cla

上面的代码运行良好。在我的用例中,“myClass1”在编译时是未知的。我在运行时以字符串形式接收myClass1的类型

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

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());
fi.SetValue(myObj,list.Cast().ToArray());

您也可以创建通用方法:

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

        fi.SetValue(myObj, list.Cast<???>().ToArray());
从linq可枚举类中获取cast方法和数组方法

var elementType = fi.GetValue(myObj).GetType().GetElementType();
...
使用null作为静态方法的第一个参数调用方法

var castMethod = typeof(System.Linq.Enumerable).GetMethod("Cast").MakeGenericMethod(elementType);
var arrayMethod = typeof(System.Linq.Enumerable).GetMethod("ToArray").MakeGenericMethod(elementType);
也许有一种更聪明的方法可以做到这一点,但这可能会让你开始。

并帮助你

你可以做:

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

在您的示例中,
GetType
就足够了,但是了解
MakeArrayType
也很好

Type t = Type.GetType("myString");
Type arrayT = Type.GetType("myString").MakeArrayType() ;