如何在运行时设置字段

How to set field during runtime

我试图设置 属性 的运行时选择类型,但它总是以 MissingFiledException 结尾。我试图通过 InvokeMember 方法和 Activator.CreateInstance(type) 创建实例。 一般来说,我想以最简单的方式将类型中的字段分配给类型,它们在接口或派生方面彼此不相似 class(例如 Data2 和 AssignmentData classes)。

class Program
{
    static void Main(string[] args)
    {
        Data ww =  GetBase(typeof(Data), new AssignmentData(){Id= 5, Text= "qq"}) as Data;
        Data2 ww2 = GetBase(typeof(Data2), new AssignmentData() { Id = 77, Text = "qrrq" }) as Data2;
        Console.ReadLine();
    }

    public static Object GetBase(Type type, AssignmentData ass)
    { 
        List<string> membersName = new List<string>(type.GetMembers().ToList().Select(x => x.Name));
        var obj = Activator.CreateInstance(type);
        //    type.InvokeMember(null, 
        //BindingFlags.DeclaredOnly | 
        //BindingFlags.Public | BindingFlags.NonPublic | 
        //BindingFlags.Instance | BindingFlags.CreateInstance, null, null, null);
        //if(membersName.Any(x => x == "Id"))
        //{
        //    type.InvokeMember("Id", 
        //        BindingFlags.Public | 
        //         BindingFlags.SetField, null, obj, new Object[] {ass.Id});
        //}
        if(membersName.Any(x => x == "Text"))
        {
            type.InvokeMember("Text", 
                BindingFlags.DeclaredOnly | 
                BindingFlags.Public | BindingFlags.NonPublic |
                BindingFlags.Instance | BindingFlags.SetField, null, obj, new Object[] { ass.Text });
        }
        return obj;
    }
    public T GetInstance<T>(Type type) where T : Type
    {
        return (T)Activator.CreateInstance(type);
    }
}

class BaseData
{
    public int Id { get; set; }
}

class Data : BaseData
{
    public string Text { get; set; }
}

class Data2 : BaseData
{
    public string Text { get; set; }
}

class AssignmentData
{
    public int Id { get; set; }
    public string Text { get; set; }
}

您想要的最终结果是什么? AssignmentData.Text 的值以 Data.Text 或 Data2.Text?

的值结束

如果那是你想要的,那么直接设置 属性 而不是使用 InvokeMember。

    ....
    ....
    if(membersName.Any(x => x == "Text"))
    {
        PropertyInfo propInfo = type.GetProperty("Text");
        propInfo.SetValue(obj, ass.Text, null);
    }
    ....
    ....

另请注意,您尝试设置的是 属性 而不是字段。您的 类 没有名为文本的字段,它们有一个名为文本的 属性。如果你真的想使用 InvokeMember 然后将 BindingFlags.SetField 更改为 BindingFlags.SetProperty 或将 Text 更改为一个字段(只是一个 public 变量)。