如何在运行时设置字段
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 变量)。
我试图设置 属性 的运行时选择类型,但它总是以 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 变量)。