如何在C#中调用私有泛型方法在运行时传递类型

如何在C#中调用私有泛型方法在运行时传递类型,c#,C#,我在.NET3.5中尝试了下面的代码,但mi为空。 如何调用私有泛型方法以便在运行时传递类型参数? 如果SaveEntityGeneric标记为public,则该代码可以正常工作,但我不想将其公开,因为它仅用于同一类中的其他方法中,以便使用GetType()传递该类类型 使用系统反射; 公共类main 1 { 静态void Main() { 新的Class1().Test(); } } 一班 { 公开无效测试() { var mi=GetType().GetMethod(“SaveEntityG

我在.NET3.5中尝试了下面的代码,但mi为空。 如何调用私有泛型方法以便在运行时传递类型参数? 如果SaveEntityGeneric标记为public,则该代码可以正常工作,但我不想将其公开,因为它仅用于同一类中的其他方法中,以便使用GetType()传递该类类型

使用系统反射;
公共类main 1
{
静态void Main()
{
新的Class1().Test();
}
}
一班
{
公开无效测试()
{
var mi=GetType().GetMethod(“SaveEntityGeneric”,BindingFlags.NonPublic);
//为什么mi是空的?
var gm=mi.MakeGenericMethod(GetType());
gm.Invoke(this,null);
}
void SaveEntityGeneric()
{
}
}

绑定标志很难正确处理此问题。使用
BindingFlags.NonPublic | BindingFlags.Instance

var mi = GetType().GetMethod("SaveEntityGeneric", 
                             BindingFlags.NonPublic | BindingFlags.Instance);
var gm = mi.MakeGenericMethod(GetType());
gm.Invoke(this, null);

只需将其设置为内部,即可防止在程序集外部使用该方法

此问题具有您所需的一切:@spender:该问题涉及公共静态方法(不需要绑定标志来查找)。这是关于私有实例方法的。这不是复制品。@StriplingWarrior:同意。幸运的是,一个问题需要5个人来回答。谢谢。从ASP.NET MVC 2控制器(从其他程序集)调用它Test()方法时,GetMethod()仍返回null。如果同时从控制器调用,如何使其工作?@Andrus:非公共反射要求您以完全信任模式运行,而ASP.NET默认情况下不会这样做(通常这样做可能不是一个好主意)。如果您理解并接受这些风险,请将应用程序设置为以完全信任的方式运行。但是,您可能需要考虑更改方法以避免访问私有方法。如果对象调用自己的私有方法,我不知道这是什么风险。没有反射,私有方法调用工作正常。它看起来像.NET中的bug。GetMethod应该始终返回对象自己的私有方法。唯一的办法似乎是公开这些方法,这很难看。我试图使用相同的代码从MVC控制器调用公共静态方法。GetMethod在MVC中找不到它,但在控制台应用程序中找到它。所以ASP.NET中也不支持公共静态方法调用?@Andrus:您的方法现在是公共的,但您的类仍然是私有的。如果将类公开,它也应该可以工作。如果在EntityBase对象的此程序集中调用,则内部方法将显示为intellisense。我正在寻找一种方法使其私有化,并从调用此私有方法的MVC2控制器调用public方法。
var mi = GetType().GetMethod("SaveEntityGeneric", 
                             BindingFlags.NonPublic | BindingFlags.Instance);
var gm = mi.MakeGenericMethod(GetType());
gm.Invoke(this, null);