【问题标题】:Object declared as public in Project1 Class1 always shows as null when called from Project2 Class2从 Project2 Class2 调用时,在 Project1 Class1 中声明为公共的对象始终显示为 null
【发布时间】:2015-10-30 09:07:36
【问题描述】:

我正在使用 C#、.Net 框架 4.5 我的解决方案中有两个项目,比如说 Project1 和 Project2,其中 Project1 添加为 Project2 的参考。 在 Project1 中,我有一个静态类“Global”,我在其中声明了一个公共静态对象列表:

namespace Solution.Project1
{
    public static class Global
    {
        public static List<OM.User> AllActiveUsers;
    }
}

在 Project2 中,我还有一个静态类“UserFactory”,其中我有一个使用 Project1 中的“AllActiveUsers”变量的静态方法:

namespace Sol.Project2
{
    public static class UserFactory
    {
    public static List<OM.User> GetUsersDetails()
        {
            List<OM.User> ret = new List<OM.User>();

            foreach (OM.User user in Project1.Global.AllActiveUsers) //here is the problem
            {
                //TODO: write logic
            }

            return ret;
        }
    }
}

我确保 AllActiveUsers 已启动并填充了 5 个用户对象,尽管在 Project2 中调用时它显示为 null! 是什么原因造成的?

更新: 不好意思我好像明白了,忘记了Project2中的方法不是直接调用的,是通过webservice调用的:

await ModMain.objWebService.GetUsersDetailsAsync();

但如果我立即从 UserFactory 调用我的方法:

UserFactory.GetUsersDetails();

那么 AllActiveUsers 不为空。 是造成这个问题的原因吗? 也许这篇文章被转换为关于从 web 服务调用方法时的问题的信息。

【问题讨论】:

  • I made sure that AllActiveUsers is initiated and filled with 5 User objects,。你能告诉我们你是在哪里做的吗?
  • 在您检查变量和您看到它为 null 之间,您的静态属性是否没有被修改?要检查这一点,您可以将静态成员临时转换为“get/set”属性,然后在“set”代码中添加断点。
  • @JurgenCamilleri 在应用程序启动时,我在 Program.cs 中对其进行了初始化。
  • @PaulDS 我添加了 set 和 get,当我只填充变量时,set 被访问过一次
  • 这很奇怪......您可以尝试在 Global 类中创建一个“静态只读”字段,并使用内联初始化。如果您对此没有问题,请尝试删除“readonly”关键字。如果您也没有遇到问题,则表示问题不是来自多项目使用。

标签: c# .net web-services .net-4.5


【解决方案1】:

经过一番搜索,我想我找到了问题。

Web 服务应用程序中的静态变量具有到工作进程的生命周期链接,因此它们可能会自动重新初始化。它们不应用于此类应用程序。来源之一:Web service variable shared for the lifetime of the webservice?

一种解决方案可能是使用应用程序状态来存储请求之间的对象:http://www.codeproject.com/Articles/13402/Building-web-services-with-persistent-state

【讨论】:

  • 非常感谢您提供此信息和您的研究。
【解决方案2】:

它必须是您初始化列表的位置。你说的是 program.cs,但我已经复制了你这样的代码。

项目 2:

class Program
{
    static void Main(string[] args)
    {
        ConsoleApplication1.Global.AllActiveUsers = new List<string>() { "test1", "test2" };
        UserFactory.GetUsersDetails();
    }
}

public static class UserFactory
{
    public static List<string> GetUsersDetails()
    {
        List<string> ret = new List<string>();

        foreach (string user in ConsoleApplication1.Global.AllActiveUsers) //here is the problem
        {
            //TODO: write logic
        }

        return ret;
    }
}

项目 1

public static class Global
{
    public static List<string> AllActiveUsers;
}

而且你这工作正常,因为我在调用静态方法之前内联初始化列表。

如果您提供初始化列表的确切位置,那么它可能会更清楚地说明您的问题。

【讨论】:

  • 是的,我也这样做并且工作正常,但是正如我在更新中添加的那样,我认为问题在于该方法是通过 web 服务调用的,所以如果我将 UserFactory.GetUsersDetails() 更改为 await ModMain.objWebService.GetUsersDetailsAsync() 我明白了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-02
  • 1970-01-01
  • 2017-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多