简体   繁体   English

缺少方法异常-查找所需的方法

[英]Missing Method Exception - find out required method

I have a data grid view that is bound to a list of a user class. 我有一个绑定到用户类列表的数据网格视图。

When I create a new row I get a missing method exception "The constructor on User.cs not found". 当我创建新行时,我得到了一个缺少的方法异常“找不到User.cs上的构造函数”。 The issue is that I have a default constructor already so I was wondering if there is a way to find out what the parameters are so that I can implement the class constructor. 问题是我已经有一个默认的构造函数,所以我想知道是否有一种方法可以找出参数是什么,以便我可以实现类构造函数。

Here is the class and constructor 这是类和构造函数

    public string Username { get; set; }
    public byte[] HashedPassword;
    public byte[] Salt ;
    public string sSalt { get { return Encoding.ASCII.GetString(Salt); } set; }
    public string sPass { get { return Encoding.ASCII.GetString(HashedPassword); } set; }
    public bool Admin { get; set; }
    public List<AnswerClass> answers { get; set; }
    public Tuple<int, int> sessionScore;

    public User(string UsernameArg = "", byte[] PasswordArg = null, byte[] SaltArg = null, bool AdminArg = false)
    {
        sessionScore = new Tuple<int, int>(0, 0);
        Username = UsernameArg;
        HashedPassword = PasswordArg;
        Salt = SaltArg;
        Admin = AdminArg;
        answers = new List<AnswerClass>();
    }

the error: 错误:

System.MissingMethodException was unhandled
HResult=-2146233069
Message=Constructor on type 'QuizProject_SourceControl_.User' not found.
Source=mscorlib
StackTrace:
   at System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes, StackCrawlMark& stackMark)
   at System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
   at System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture)
   at System.SecurityUtils.SecureCreateInstance(Type type, Object[] args, Boolean allowNonPublic)
   at System.ComponentModel.BindingList`1.AddNewCore()
   at System.ComponentModel.BindingList`1.System.ComponentModel.IBindingList.AddNew()
   at System.Windows.Forms.CurrencyManager.AddNew()
   at System.Windows.Forms.DataGridView.DataGridViewDataConnection.AddNew()
   at System.Windows.Forms.DataGridView.DataGridViewDataConnection.OnNewRowNeeded()
   at System.Windows.Forms.DataGridView.OnRowEnter(DataGridViewCell& dataGridViewCell, Int32 columnIndex, Int32 rowIndex, Boolean canCreateNewRow, Boolean validationFailureOccurred)
   at System.Windows.Forms.DataGridView.SetCurrentCellAddressCore(Int32 columnIndex, Int32 rowIndex, Boolean setAnchorCellAddress, Boolean validateCurrentCell, Boolean throughMouseClick)
   at System.Windows.Forms.DataGridView.OnCellMouseDown(HitTestInfo hti, Boolean isShiftDown, Boolean isControlDown)
   at System.Windows.Forms.DataGridView.OnCellMouseDown(DataGridViewCellMouseEventArgs e)
   at System.Windows.Forms.DataGridView.OnMouseDown(MouseEventArgs e)
   at System.Windows.Forms.Control.WmMouseDown(Message& m, MouseButtons button, Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.DataGridView.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
   at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
   at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
   at System.Windows.Forms.Application.Run(Form mainForm)
   at QuizProject_SourceControl_.Program.Main() in d:\Programming\Repos\QuizProject(SourceControl)\QuizProject(SourceControl)\Program.cs:line 19
   at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
   at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()
InnerException: 

You don't have a default constructor. 您没有默认的构造函数。 A default constructor is a constructor without any parameters: 默认构造函数是不带任何参数的构造函数:

public User()
{
    ...
}

What you have is a constructor where all parameters have default values. 您所拥有的是一个构造函数,其中所有参数都具有默认值。 That is a big difference, and the reason therefore is the way that default values for parameters work in .NET: 这是一个很大的差异,因此原因是.NET中参数默认值的工作方式:
In .NET, the compiler copies the default values to every location where you call that constructor (or any other method). 在.NET中,编译器将默认值复制到调用该构造函数(或任何其他方法)的每个位置。 So basically, default values for parameters are only syntactic sugar. 因此,基本上,参数的默认值只是语法糖。

Example: 例:
Assume you have a method like this: 假设您有一个这样的方法:

public void Method(int para = 12)
{
}

Now, somewhere in your code, you call it like this: 现在,在代码中的某处,您可以这样称呼它:

Method();

The compiler will change this and the code that actually gets compiled will look like this: 编译器将对此进行更改,而实际被编译的代码将如下所示:

public void Method(int para)
{
}

Method(12);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM