【发布时间】:2021-06-06 20:52:34
【问题描述】:
我是反射和依赖注入概念的新手,为了更好地理解,我开始运行一些代码。
我正在尝试从包含 T 对象的泛型类的方法中调用类 T 的非泛型方法。
考虑以下示例代码,当我运行它时,我得到了:
System.InvalidOperationException: Void DisplayProperty() 不是 通用方法定义。 MakeGenericMethod 只能在 MethodBase.IsGenericMethodDefinition 为 true 的方法。
我做错了什么?
using System;
using System.Collections.Generic;
using System.Reflection;
namespace di001
{
class MyDependency
{
private String _property;
public String Property
{
get => _property;
set => _property = value;
}
public void DisplayProperty()
{
Console.WriteLine(Property);
}
}
class DIClass<T>
{
public T obj;
public void DisplayMessage()
{
MethodInfo method = typeof(T).GetMethod("DisplayProperty");
MethodInfo generic = method.MakeGenericMethod(typeof(T));
generic.Invoke(this, null);
}
public DIClass(T obj)
{
this.obj = obj;
}
}
class Program
{
static void Main(string[] args)
{
DIClass<MyDependency> x = new DIClass<MyDependency>(new MyDependency());
x.DisplayMessage();
}
}
}
【问题讨论】:
-
我认为这里的“MakeGenericMethod”有问题。
-
我认为这行根本没有必要,
T一旦构造就不是通用的,method肯定不是。你应该可以做typeof(T).GetMethod("DisplayProperty").Invoke我也想你想用参数Invoke调用(obj, null) -
你能试试 public void DisplayMessage
(){} 如果这可行,请告诉我,我会回答这个问题 -
@Charlieface 谢谢,问题现在解决了!
-
当您获得
typeof(T)时,将获得您实例化DIClass的泛型类型,在本例中为MyDependency。此时您有一个完整的类定义,无需调用MakeGenericType。只需致电GetMethod("DisplayProperty")以获取MethodInfo然后Invoke它。但是,DisplayProperty是MyDependency的实例属性,因此您需要该类型的实例
标签: c# asp.net-core reflection system.reflection