2017-09-29 37 views
0

我嘗試通過反射調用單例類中的函數。我收到以下異常:如何在c中使用反射來調用單例類中的函數#

System.Reflection.TargetInvocationException:調用的目標引發了異常。 ---> System.ArgumentException:具有相同密鑰的條目已經存在。

類和調用方法放在下面。任何人都知道我做錯了什麼?

public class SetStatus{ 
    private static readonly SetStatus instance = new SetStatus(); 
    protected SortedDictionary<int, string> resources = new SortedDictionary<int, string>(); 

    public static SetStatus Instance 
    { 
     get 
     { 
      return instance; 
     } 
    } 
    protected override void LoadResources() 
    { 
     resources.Add(0, MyApp.Resources.Localization.Approved); 
     resources.Add(1, MyApp.Resources.Localization.Rejected); 
     resources.Add(2, MyApp.Resources.Localization.Revoked); 
    } 

    public SetStatus() 
    { 
     LoadResources(); 
    } 

    public SortedDictionary<int, string> Resources 
    { 
     get 
     { 
      return resources; 
     } 
    } 
} 



void ResetStaticEnums() 
{ 
    string methodName = "LoadResources"; 
    MethodInfo method = typeof(SetStatus).GetMethod(methodName, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); 
    method.Invoke(SetStatus.Instance, Type.EmptyTypes); 
} 
+0

3調用'resources.Add(...'與鍵的值相同..並且您不能在字典中有重複的鍵。這就是爲什麼你有這個錯誤 –

回答

0

您撥打LoadResources兩次。

  1. 在你的構造public SetStatus()private static readonly SetStatus instance = new SetStatus();
  2. 在您的通話method.Invoke(SetStatus.Instance, Type.EmptyTypes);

,這導致例外:

具有相同鍵的條目已經存在

在您的構造函數中刪除LoadResources();並且它將工作(一次)

3

不能相同的鍵添加到字典多次

protected override void LoadResources() 
    { 
     resources.Add(Convert.ToInt32(WeekStatus.AdministrationApproved), MyApp.Resources.Localization.Approved); 
     resources.Add(Convert.ToInt32(WeekStatus.AdministrationApproved), MyApp.Resources.Localization.Rejected); 
     resources.Add(Convert.ToInt32(WeekStatus.AdministrationApproved), MyApp.Resources.Localization.Revoked); 
    } 

你加入AdministrationApproved 3倍。

+0

對不起,我試圖簡化我的例子,並複製/粘貼太多。我的分類字典沒有相同的密鑰。 – Linschoten

相關問題