繁体   English   中英

扩展方法必须在非通用静态类中定义

[英]Extension method must be defined in a non-generic static class

我有个问题。 重命名此Web表单后,出现此错误,但我将所有内容更改为新名称,但出现此错误。 请帮忙。 代码:

using System;
using System.Collections.Generic;
using System.Data;
using System.Globalization;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class bVoteAnswer : System.Web.UI.Page
{
    UserVotes ue = new UserVotes();
    bVotes bv = new bVotes();
    bVoteAnswers ve = new bVoteAnswers();
    public void Page_Load(object sender, EventArgs e)
    {

        dropdownlist.Enabled = false;
        int BuildingId = Convert.ToInt32(Session["BuildingId"]);
        DataTable dt = new DataTable();
        dt = bv.Select(0, "", "", "", BuildingId, "",0);
        Grid_Vote.DataSource = dt;
        Grid_Vote.DataBind();

    }
protected void Grid_Vote_RowCreated(object sender, GridViewRowEventArgs e)
{
    e.Row.Cells[0].Visible = false;
}

protected void Grid_Vote_SelectedIndexChanged(object sender, EventArgs e)
{
    dropdownlist.Enabled = true;
    int VoteId = Convert.ToInt32(Grid_Vote.SelectedRow.Cells[0].Text);
    DataTable dt = new DataTable();
    dt = ve.Select(0,VoteId,"");
    for (int i = 0; i <= dt.Rows.Count; i++)
    {
        ListItem l = new ListItem(dt.Rows[i][2].ToString(), dt.Rows[i][2].ToString());
        dropdownlist.Items.Add(l);
    }
}

protected void btn_insert_Click(object sender, EventArgs e)
{
    int OwnerId = Convert.ToInt32(Session["OwnerId"]);
    int VoteId = Convert.ToInt32(Grid_Vote.SelectedRow.Cells[0].Text);
    DataTable dt = new DataTable();
    dt = ve.Select(0, VoteId, dropdownlist.SelectedValue);
    int AnswerId = Convert.ToInt32(dt.Rows[0][0]);
    DateTime ClientDateTime = DateTime.Now;
    string PersianDate = GetPersianDate(ClientDateTime);
    ue.Insert(0, VoteId, OwnerId, AnswerId, PersianDate);
}


public static string GetPersianDate(this DateTime date)
{
    PersianCalendar jc = new PersianCalendar();
    return string.Format("{0:0000}/{1:00}/{2:00}", jc.GetYear(date), jc.GetMonth(date), jc.GetDayOfMonth(date));
}

}

我将名称更改为名字,但错误显示我认为这不是错误,Visual Studio不能运行

扩展方法必须在静态类中。

public partial class bVoteAnswer

这不是静态类。 将函数移到静态类。

public static class ExtensionMethods
{
   public static string GetPersianDate(this DateTime date)
    {
        PersianCalendar jc = new PersianCalendar();
        return string.Format("{0:0000}/{1:00}/{2:00}", jc.GetYear(date), 
               jc.GetMonth(date), jc.GetDayOfMonth(date));
      }

}

扩展方法GetPersianDate需要在静态类中定义。 您可以这样重构:

public partial class bVoteAnswer : System.Web.UI.Page
{
    UserVotes ue = new UserVotes();
    bVotes bv = new bVotes();
    bVoteAnswers ve = new bVoteAnswers();
    public void Page_Load(object sender, EventArgs e)
    {

        dropdownlist.Enabled = false;
        int BuildingId = Convert.ToInt32(Session["BuildingId"]);
        DataTable dt = new DataTable();
        dt = bv.Select(0, "", "", "", BuildingId, "",0);
        Grid_Vote.DataSource = dt;
        Grid_Vote.DataBind();

    }

    protected void Grid_Vote_RowCreated(object sender, GridViewRowEventArgs e)
    {
        e.Row.Cells[0].Visible = false;
    }

    protected void Grid_Vote_SelectedIndexChanged(object sender, EventArgs e)
    {
        dropdownlist.Enabled = true;
        int VoteId = Convert.ToInt32(Grid_Vote.SelectedRow.Cells[0].Text);
        DataTable dt = new DataTable();
        dt = ve.Select(0,VoteId,"");
        for (int i = 0; i <= dt.Rows.Count; i++)
        {
            ListItem l = new ListItem(dt.Rows[i][2].ToString(), dt.Rows[i][2].ToString());
            dropdownlist.Items.Add(l);
        }
    }

    protected void btn_insert_Click(object sender, EventArgs e)
    {
        int OwnerId = Convert.ToInt32(Session["OwnerId"]);
        int VoteId = Convert.ToInt32(Grid_Vote.SelectedRow.Cells[0].Text);
        DataTable dt = new DataTable();
        dt = ve.Select(0, VoteId, dropdownlist.SelectedValue);
        int AnswerId = Convert.ToInt32(dt.Rows[0][0]);
        DateTime ClientDateTime = DateTime.Now;
        string PersianDate = GetPersianDate(ClientDateTime);
        ue.Insert(0, VoteId, OwnerId, AnswerId, PersianDate);
    }
}

public static class PersionCalendarExtension
{
    public static string GetPersianDate(this DateTime date)
    {
        PersianCalendar jc = new PersianCalendar();
        return string.Format("{0:0000}/{1:00}/{2:00}", jc.GetYear(date), jc.GetMonth(date), jc.GetDayOfMonth(date));
    }
}

从中删除“ this”

GetPersianDate(this DateTime date)

无论如何,您都没有将其用作扩展方法,这使您可以编写例如

DateTime.Now.GetPersianDate()

您可以在此处阅读有关扩展方法的更多信息: https : //docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/extension-methods

暂无
暂无

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

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