2015-07-09 131 views
0

我試圖設置運行時選擇類型的屬性,但它始終以MissingFiledException結束。我試圖通過InvokeMember方法和Activator.CreateInstance(type)來創建實例。 通常我想從類型中分配字段以鍵入最簡單的方式,這些方式與接口或派生類(例如Data2和AssignmentData類)不相似。如何在運行時設置字段

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

回答

1

您在最終結果中尋找什麼? AssignmentData.Text的值以Data.Text或Data2.Text的值結尾?

如果這是你想要的,那麼直接設置屬性而不是使用InvokeMember。

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

此外,請注意您正試圖設置屬性而不是字段。您的類沒有名爲Text的字段,它們具有名爲Text的屬性。如果您確實想使用InvokeMember,請將BindingFlags.SetField更改爲BindingFlags.SetProperty,或將Text更改爲一個字段(只是一個公共變量)。

+0

非常感謝。我怎麼能比接受答案更好地感謝你?我的意思是任何徽章或一些? – Bajer9011

+0

我只是想用DataAssignment中的值填充Data2屬性。我已將'GetMembers()'替換爲'GetPrperties()' – Bajer9011

+0

沒問題。我想剛剛投票的答案。 – James