У меня есть статический класс, который ищет реализацию абстрактного типа и сохраняет ее как статическое свойство, подобное приведенному ниже:
public static class MyStaticClass
{
private static MyAbstractType _MyAbstractImplementation;
public static MyAbstractType MyAbstractImplementation
{
get => _MyAbstractImplementation ?? ( _MyAbstractImplementation = FindImplementation());
private set => _MyAbstractImplementation = value;
}
}
И я пытаюсь вызвать метод MyAbstractImplementation (который не содержит статических свойств или методов) через отражение:
var myAssembly = Assembly.Load("MyStaticClassAssembly")
var myType = myAssembly.GetTypes().First(t => t.Name == "MyAbstractType");
var myImplementation = myType.GetProperties()
.First(p=>p.ReflectedType?.Name == "MyAbstractImplementation")
.GetValue(null);
var obj = myType.GetMethod("SomeMethod")?.Invoke(
null,
new object[]
{
// Some args
});
Приведенный выше код вызывает следующее исключение при получении значения MyAbstractImplementation
:
System.Reflection.TargetException: Non-static method requires a target.
Очевидно, это потому, что я передаю null в GetValue()
, поэтому я пытаюсь передать myAssembly
, а не null, и получаю следующее исключение:
System.Reflection.TargetException: Object does not match target type.
В отчаянии я пытаюсь передать myType
и myImplementation
, но все равно получаю то же исключение.
Что я должен передать GetValue()
?
MyAbstractType
- person Titian Cernicova-Dragomir   schedule 05.02.2018MyAbstractType
не изMyStaticClass
, поэтому я могу предположить, чтоMyStaticClass
также имеет реализациюMyAbstractImplementation
, но не является статической. Может быть, вы хотели сделатьmyAssembly.GetTypes().First(t => t.Name == "MyStaticClass");
? - person Gusman   schedule 05.02.2018SomeMethod
вMyAbstractType
, а неMyAbstractImplementation
. - person Minijack   schedule 05.02.2018