Получить пользовательский ресурс и строку преобразования пользовательского ключа в «ResourceManager»

#c# #asp.net #reflection #resx

#c# #asp.net #отражение #resx

Вопрос:

Я пытаюсь получить ресурс для перевода в ASP.NET , используя преобразование строки в тип ResourceManager и файл внешних ресурсов для перевода. Но когда я выполняю, я вижу эту ошибку:

 Object reference not set to an instance of an object.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.
Source Error:

Line 24:             Type myProp = element.GetProperty("ResourceManager").GetType();
Line 25:             MethodInfo getString = myProp.GetMethod("GetString");
Line 26:             var r = getString.Invoke(this, new object[] { key });
Line 27:             return r.ToString();
Line 28:         }
  

Это мой код:

 protected string getText(string key)
{
    Type element = Type.GetType($"Website.Language.{translation}.general");
    Type myProp = element.GetProperty("ResourceManager").GetType();
    MethodInfo getString = myProp.GetMethod("GetString");
    var r = getString.Invoke(this, new object[] { key });
    return r.ToString();
}
  

По-видимому, getString переменная возвращает значение null, но метод «getString» должен вызывать метод «getString» ResourceManager.
Кто-нибудь может мне помочь с этим?

Комментарии:

1. Вы пытаетесь вызвать метод GetString в экземпляре this , но он MethodInfo поступает из type MSD_Website.Language.{translation}.general .

2. Привет, @Michael, я меняю это на element, а после на myProp, по я получаю ту же ошибку

Ответ №1:

Первый параметр MethodInfo.Invoke должен быть экземпляром некоторого объекта (насколько я знаю, он должен быть того же типа, о котором вы размышляете, в вашем случае Website.Language.{translation}.general ).

Это может не сработать, но просто чтобы показать вам, в каком направлении вам нужно двигаться.

 protected string getText(string key)
{
    Type element = Type.GetType($"Website.Language.{translation}.general");
    var instance = Activator.CreateInstance(element);
    Type myProp = element.GetProperty("ResourceManager").GetType();
    MethodInfo getString = myProp.GetMethod("GetString");
    var r = getString.Invoke(instance, new object[] { key });
    return r.ToString();
}
  

Смотрите также этот пример.