声明为public的方法未找到

时间:2015-01-28 14:46:25

标签: c# .net list collections

在我的common.cs类中,我对基于类的列表进行了以下声明:

public static List<edbService> edb_service;

public class edbService
{
    public string ServiceID { get; set; }
    public string ServiceName { get; set; }
    public string ServiceDescr { get; set; }
    public string ServiceInterval { get; set; }
    public string ServiceStatus { get; set; }
    public string ServiceUrl { get; set; }
    public string SourceApplication { get; set; }
    public string DestinationApplication { get; set; }
    public string Function { get; set; }
    public string Version { get; set; }
    public string userid { get; set; }
    public string credentials { get; set; }
    public string orgid { get; set; }
    public string orgunit { get; set; }
    public string customerid { get; set; }
    public string channel { get; set; }
    public string ip { get; set; }
}

我有一个公共方法来填充同一类(common.cs)中声明为这样的xml数据文件的列表:

#region PublicMethods

public List<edbService> populateEDBService(string xmlDataFile)
{
try
{
XElement x = XElement.Load(global::EvryCardManagement.Properties.Settings.Default.DataPath + xmlDataFile);

// Get global settings
IEnumerable<XElement> services = from el in x.Descendants("Service")
         select el;
if (services != null)
{
  edb_service = new List<edbService>();
  foreach (XElement srv in services)
  {
  edbService edbSrv = new edbService();

  edbSrv.ServiceID = srv.Element("ServiceID").Value;
  edbSrv.ServiceName = srv.Element("ServiceName").Value;
  edbSrv.ServiceDescr = srv.Element("ServiceDescr").Value;
  edbSrv.ServiceInterval = srv.Element("ServiceInterval").Value;
  edbSrv.ServiceStatus = srv.Element("ServiceStatus").Value;
  edbSrv.ServiceUrl = srv.Element("ServiceUrl").Value;

  foreach (XElement ServiceHeader in srv.Elements("ServiceHeader"))
  {
    edbSrv.SourceApplication = ServiceHeader.Element("SourceApplication").Value;
    edbSrv.DestinationApplication = ServiceHeader.Element("DestinationApplication").Value;
    edbSrv.Function = ServiceHeader.Element("Function").Value;
    edbSrv.Version = ServiceHeader.Element("Version").Value;

    foreach (XElement ClientContext in ServiceHeader.Elements("ClientContext"))
    {
    edbSrv.userid = ClientContext.Element("userid").Value;
    edbSrv.credentials = ClientContext.Element("credentials").Value;
    edbSrv.orgid = ClientContext.Element("orgid").Value;
    edbSrv.orgunit = ClientContext.Element("orgunit").Value;
    edbSrv.customerid = ClientContext.Element("customerid").Value;
    edbSrv.channel = ClientContext.Element("channel").Value;
        edbSrv.ip = ClientContext.Element("ip").Value;
        }
      }

      edb_service.Add(edbSrv);
      }
    }
  }
  catch (Exception ex)
  {
  /* Write to log */
  Common.logBuilder("CustomerCreate : Form --> CustomerCreate <--", "Exception", Common.ActiveMQ,
    ex.Message, "Exception");
  /* Send email to support */
  emailer.exceptionEmail(ex);
  }
  return edb_service;
}

但问题是,在我的调用类中,当我尝试从此方法返回一个列表时,找不到它 - 我得到一个编译错误,需要一个对象引用。

我试着这样称呼它:

  

Common.edbService edb_service = Common.populateEDBService(“CardUpdate.xml”);

我收到以下错误:

  

非静态字段,方法或属性'EvryCardManagement.Common.populateEDBService(string)'

需要对象引用

我做错了什么?

我想有一个可以从几个类调用的泛型方法(在我的表单上由后台工作程序实例化后运行异步)

3 个答案:

答案 0 :(得分:1)

您需要创建类static,或创建一个对象来调用它。

class edbService { }

public static void Main() {
  //this is error
  edbService.populateEDBService("");

  //this is correct
  edbService s = new edbService();
  s.populateEDBService("");
}

我的示例中的最后一行显示了编译器所需的对象引用。这里的s变量是对象引用。

答案 1 :(得分:1)

您的XML中是否有任何缺失值?如果缺少值,.Value属性将不起作用。因此,如果缺少ServiceID,则srv.Element("ServiceID").Value;将导致错误。您可以让它返回空字符串以查找缺失值,例如,使用(string)srv.Element("ServiceID");

答案 2 :(得分:1)

您可以尝试将方法设为静态。

public static List<edbService> populateEDBService(string xmlDataFile)
{
   //Your code here
   ....
}

现在,您可以使用common.populateEDBService();

从所有其他类调用此方法