我正在尝试在密封类中访问内部方法,但由于它是一个密封类,我无法继承内部方法。我正在研究的解决方案的后端部分是这样设计的。
我找到了一个解决方法,它使用了类的扩展
public static class LocalizationsManagerExtension
{
public static string AddAppUserBasic(this LocalizationsManager objDotnet, AppUser newUser, string pword)
{
try
{
objDotnet.AddAppUserBasic(newUser, pword);
return "Success!";
}
catch(Exception ex)
{
return ex.Message;
}
//return IdentityResult.Success;
//return System.Threading.Tasks.Task.Run();
//return "Welcome to the World of DotNet....Mr. " + password;
}
}
public ActionResult UserAddNew(UserAddNewModel model)
{
if (ModelState.IsValid)
{
var user = new DataAccess.AppUser();
user.Name = model.username;
user.Password = model.password;
user.DeveloperRole = model.isDeveloperRole;
user.AdministratorRole = model.isAdministratorRole;
user.TranslatorRole = model.isTranslatorRole;
user.IsDomainUser = model.IsDomainUser;
user.ManagerRole = model.isManagerRole;
user.State = Data.Framework.Repository.Helpers.ObjectState.Added;
var result = LM.AddAppUserBasic(user, user.Password);
if (result == "Success!")
{
ViewBag.ReturnUrl = "/Usermanagement/UserLogin";
//return RedirectToAction("UserLogin", "UserManagement");
}
else { }
}
// If we got this far, something failed, redisplay form
return View(model);
}
我试过这个,但没有运气。我可以在我正在调用的另一个方法中调用“AddAppUserBasic”,但它正在调用本地方法。不是密封班的那个。
答案 0 :(得分:3)
您不能访问类中的内部方法。内部方法是内部原因。如果您认为应该使用内部方法 - 首先与其他程序员交谈,为什么他/她将此方法设为内部方法。也许是错误的。如果没有,请确认是否应该使用其他公共方法。
如果你真的真的想要出于某种原因使用这种方法,你知道你做了什么
你可以使用反射来做到这一点:
using System.Reflection;
Type t = typeof(YourSealedClass); //get the type of your class
YourSealedClass obj = new YourSealedClass(); //somehow get the instance of the class
//find all non public methods
MethodInfo[] methods = t.GetMethods(BindingFlags.NonPublic|BindingFlags.Instance);
//next find your method. You can use LINQ or good old loop:
foreach(MethodInfo mi in methods)
if(mi.Name == "MethodYouWantToUse")
{
mi.Invoke(obj, null);
break; //leave the loop
}
您可以在此处详细了解Invoke:https://msdn.microsoft.com/pl-pl/library/a89hcwhh(v=vs.110).aspx
简单地说 - 如果你调用Invoke,你必须传递类的对象和方法的参数 - 如果有的话。
但请记住 - 这样做你可能会搞砸了。
答案 1 :(得分:0)
与流行的看法相反,有一种方法可以访问类的内部方法。问题是你真的不应该这样做。
这可能在某些条件下不起作用,但可以使用此示例证明该概念。让我们从一个具有内部方法的密封类开始:
namespace ClassLibrary1
{
public sealed class SealedInternalExample
{
internal void TryAndExecuteMe (int someNumber)
{
System.Console.WriteLine("Internal method executed. Parameter: {0}",
someNumber);
}
}
}
您无法通过正常的通话约定执行SealedInternalExample.TryAndExecuteMe
。但你可以通过反思这样做:
namespace CallInternalExample
{
class Program
{
static void Main(string[] args)
{
var classInstance = new SealedInternalExample();
var methods = classInstance.GetType().GetMethods(
System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.Public |
System.Reflection.BindingFlags.Instance);
for (int x = 0; x < methods.Length; x++)
System.Console.WriteLine("{0}: {1}", x, methods[x].Name);
var internalMethod = methods.FirstOrDefault
((m) => m.Name.Equals("TryAndExecuteMe",
StringComparison.InvariantCulture));
internalMethod.Invoke(classInstance, new object[] { 15 });
}
}
}
该计划的输出是:
0: TryAndExecuteMe
1: ToString
2: Equals
3: GetHashCode
4: GetType
5: Finalize
6: MemberwiseClone
Internal method executed. Parameter: 15