【问题标题】:How to call a function in a singleton class, using reflection in c#如何在单例类中调用函数,在c#中使用反射
【发布时间】:2017-09-29 14:07:37
【问题描述】:

我尝试通过反射调用单例类中的函数。我得到以下异常:

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

【问题讨论】:

  • 3 次调用 resources.Add(... 与 key 具有相同的值。而且字典中不能有重复的键。这就是您出现此错误的原因

标签: c#


【解决方案1】:

您不能多次将同一个键添加到字典中

   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 次。

【讨论】:

  • 对不起,我试图简化我的示例并复制/粘贴太多。我的排序字典没有相同的键。
【解决方案2】:

您拨打LoadResources 两次。

  1. 在你的构造函数public SetStatus()private static readonly SetStatus instance = new SetStatus();
  2. 在您的电话中method.Invoke(SetStatus.Instance, Type.EmptyTypes);

这会导致异常:

已存在具有相同键的条目

在您的构造函数中删除LoadResources();,它将起作用(一次)

【讨论】:

    猜你喜欢
    • 2020-01-11
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-03
    相关资源
    最近更新 更多