【问题标题】:How to call private generic method in C# passing type in runtime如何在运行时调用 C# 中的私有泛型方法传递类型
【发布时间】:2011-09-13 15:55:24
【问题描述】:

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

using System.Reflection;

public class Main1
{
    static void Main()
    {
        new Class1().Test();
    }
}

class Class1
{

    public void Test()
    {
        var mi = GetType().GetMethod("SaveEntityGeneric", BindingFlags.NonPublic);
        // why mi is null ?
        var gm = mi.MakeGenericMethod(GetType());
        gm.Invoke(this, null);
    }

    void SaveEntityGeneric<TEntity>()
    {
    }
}

【问题讨论】:

  • 这个问题有你所需要的一切:Select Right Generic Method with Reflection
  • @spender:这个问题是关于公共静态方法(不需要绑定标志来查找)。这是关于私有实例方法的。它不是重复的。
  • @StriplingWarrior:同意。幸运的是,关闭一个问题需要 5 个人。

标签: c#


【解决方案1】:

绑定标志很难做到这一点。使用BindingFlags.NonPublic | BindingFlags.Instance

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

【讨论】:

  • 谢谢。它从 ASP .NET MVC 2 控制器(从其他程序集)调用 Test() 方法,GetMethod() 仍然返回 null。如果也从控制器调用如何使其工作?
  • @Andrus:NonPublic 反射要求您在完全信任模式下运行,而 ASP.NET 在默认情况下不这样做(通常这样做可能不是一个好主意)。如果您了解并接受这些风险,请将您的应用程序设置为以完全信任的方式运行。但是您可能需要考虑更改方法以避免访问私有方法的需要。
  • 我不明白如果对象调用自己的私有方法有什么风险。没有反射私有方法调用工作正常。它看起来像 .NET 中的错误。 GetMethod 应始终返回对象自己的私有方法。唯一的办法似乎是公开那些丑陋的方法。
  • 我尝试使用相同的代码从 MVC 控制器调用公共静态方法。 GetMethod 在 MVC 中找不到,但在控制台应用程序中找到。所以 ASP .NET 也不支持公共静态方法调用?
  • @Andrus:你的方法现在是公开的,但你的类仍然是私有的。如果您也公开您的课程,它应该可以工作。
【解决方案2】:

只需将其设为 internal,这将防止在程序集之外使用该方法

【讨论】:

  • 如果在此程序集中为 EntityBase 对象调用内部方法,则会出现在智能感知中。我正在寻找一种将其设为私有并从调用此私有方法的 MVC2 控制器调用公共方法的方法。
猜你喜欢
  • 2013-08-13
  • 1970-01-01
  • 2012-12-10
  • 2021-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-21
  • 1970-01-01
相关资源
最近更新 更多