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

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 txt2");
            list.Add(newObj);

        }

        fi.Setvalue(myobj,list.Cast<myClass1>().ToArray());

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

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

        fi.Setvalue(myobj,list.Cast<???>().ToArray());
Blackboard123 回答:如何使用反射将IList动态转换为任意数据类型的数组

您也可以创建通用方法:

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

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

从linq可枚举类中获取类型转换方法和数组方法。

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);

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

,

Type.GetTypeType.MakeArrayType助您一臂之力。

您可以这样做:

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

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

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

本文链接:https://www.f2er.com/2568647.html

大家都在问