i trying set property of runtime choosen type ends missingfiledexception. have tried create instance invokemember method , activator.createinstance(type). want assign fields type type simpliest way, aren't similar eachother interface or derived class (e.g data2 , assignmentdata classes).
class program { static void main(string[] args) { data ww = getbase(typeof(data), new assignmentdata(){id= 5, text= "qq"}) data; data2 ww2 = getbase(typeof(data2), new assignmentdata() { id = 77, text = "qrrq" }) 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) 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; } }
what looking in end result? value of assignmentdata.text end in value of data.text or data2.text?
if want set property directly instead of using invokemember.
.... .... if(membersname.any(x => x == "text")) { propertyinfo propinfo = type.getproperty("text"); propinfo.setvalue(obj, ass.text, null); } .... .... also, note trying set property not field. classes don't have field called text, have property called text. if want use invokemember change bindingflags.setfield bindingflags.setproperty or change text field (just public variable).
Comments
Post a Comment