【问题标题】:C# Interface Class Question Cannot See MethodC#接口类问题看不到方法
【发布时间】:2011-04-14 19:32:45
【问题描述】:
public interface IGroups
{
    IList<Group> GetGroups(UserGroup usrGrp);
}

public class GetUsrGrps : IGroups
{
    public IList<Group> GetGroups(UserGroup usrGroup)
    {
        List<Group> grps = new List<Group>();
        UserGroupDao UsrGrpDao = new UserGroupDao();
        DbDataReader ddr = UsrGrpDao.GetUserGroups(usrGroup);
        if (ddr.HasRows)
        {
            while (ddr.Read())
            {
                Group grp = new Group();
                grp.GroupId = Convert.ToInt32(ddr["groupId"]);
                grps.Add(grp);
            }
        }
        else
        {
            Group grp = new Group();
            grp.GroupId = Convert.ToInt32("0");
            grps.Add(grp);
        }
        return grps;
    }
}



 public UserGroup GetUser(UserGroup usrGrp)
    {

        UserGroupDao usrGroupDao = new UserGroupDao();
        DbDataReader ddr = usrGroupDao.GetUser(usrGrp);
        if (ddr.HasRows)
        {
            while (ddr.Read())
            {
                usrGrp.Id = Convert.ToInt32(ddr["id"]);
                usrGrp.FirstName = Convert.ToString(ddr["firstname"]);
                usrGrp.LastName = Convert.ToString(ddr["lastname"]);
                usrGrp.UserName = Convert.ToString(ddr["username"]);
            }
        }
        usrGrp.UserGroups = GetUsrGrps.GetGroups(usrGrp);
        return this;
    }

usrGrp.Groups is defined as IList<Group>...?  }

**usrGrp.UserGroups = GetUsrGrps.GetGroups(usrGrp);

【问题讨论】:

    标签: c# class interface ilist


    【解决方案1】:

    GetGroups 是一个实例方法。用static 关键字标记它或创建其包含类的实例并引用该实例中的方法。考虑到方法 GetGroups 是接口的一部分,我建议使用实例路由,以便您的类定义仍然与接口协定匹配。

    【讨论】:

    • 这种情况下不再考虑实现接口。
    • @Lasse:为此进行编辑。谢谢!
    【解决方案2】:

    您收到该错误是因为 GetGroups 不是 GetUsrGrps 上的静态方法。

    您需要将其声明为静态或创建 GetUsrGrps 的新实例以调用 GetGroups 方法。

    【讨论】:

      【解决方案3】:

      您最好的选择是放弃 IGroups 接口,并将方法标记为静态。由于无论如何这只是一个数据库访问对象,因此将其作为静态方法是有意义的。

      如果要保留接口,则必须实例化一个对象。

      usrGrp.UserGroups = (new GetUsrGrps).GetGroups(usrGrp);
      

      【讨论】:

      • @Jeff Yates - 你可能是对的。我一定是一个非常不安的人! ;-)
      【解决方案4】:

      应该只是

      usrGrp.UserGroups = GetGroups(usrGrp);
      

      编译器认为您正在尝试调用静态方法,而 GetGroups 不是

      【讨论】:

        【解决方案5】:

        你想要

         IGroups groups = new GetUsrGrps();
         usrGrp.UserGroups = groups.GetGroups(usrGrp);
        

        您当前正在调用它,就好像它是静态的,但您的意图似乎是通过IGroups 接口访问它。

        【讨论】:

          【解决方案6】:

          你的方法不是静态的,或者你的类没有被实例化。

          您需要创建一个类的实例,例如:

          var getUsrGrps = new GetUsrGrps();
          

          然后改变

          usrGrp.UserGroups = GetUsrGrps.GetGroups(usrGrp);
          

          usrGrp.UserGroups = getUsrGrps.GetGroups(usrGrp);
          

          改变

          public IList<Group> GetGroups(UserGroup usrGroup)
          

          public static IList<Group> GetGroups(UserGroup usrGroup)
          

          看起来两者都适合你。

          【讨论】:

            猜你喜欢
            • 2021-10-27
            • 2011-04-11
            • 2016-09-28
            • 2019-01-02
            • 2012-12-14
            • 1970-01-01
            • 2010-09-30
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多