从 Project2 Class2 调用时,在 Project1 Class1 中声明为 public 的对象始终显示为 null
Object declared as public in Project1 Class1 always shows as null when called from Project2 Class2
我正在使用 C#、.Net Framework 4.5
我的解决方案中有两个项目,假设是 Project1 和 Project2,其中添加了 Project1 作为 Project2 的参考。
在 Project1 中,我有一个静态 class "Global",其中我声明了一个 public 静态对象列表:
namespace Solution.Project1
{
public static class Global
{
public static List<OM.User> AllActiveUsers;
}
}
在项目 2 中,我还有一个静态 class "UserFactory",其中我有一个使用项目 1 中的 "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 中调用此处时它显示为空!
什么会导致这种情况?
更新:
sorry我好像明白了,我忘了project2里面的方法不是直接调用的,是通过webservice调用的:
await ModMain.objWebService.GetUsersDetailsAsync();
但是如果我立即从 UserFactory 调用我的方法:
UserFactory.GetUsersDetails();
那么 AllActiveUsers 不为空。
这是导致这个问题的原因吗?
也许这个 post 被转换成一个关于从 webservice 调用方法时的问题的信息。
它必须是您初始化列表的地方。你说 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 服务应用程序中的静态变量对工作进程有生命周期 link,因此它们可能会自动重新初始化。它们不应该用于此类应用程序。来源之一:Web service variable shared for the lifetime of the webservice?
一个解决方案可能是使用应用程序状态来存储请求之间的对象:http://www.codeproject.com/Articles/13402/Building-web-services-with-persistent-state
我正在使用 C#、.Net Framework 4.5 我的解决方案中有两个项目,假设是 Project1 和 Project2,其中添加了 Project1 作为 Project2 的参考。 在 Project1 中,我有一个静态 class "Global",其中我声明了一个 public 静态对象列表:
namespace Solution.Project1
{
public static class Global
{
public static List<OM.User> AllActiveUsers;
}
}
在项目 2 中,我还有一个静态 class "UserFactory",其中我有一个使用项目 1 中的 "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 中调用此处时它显示为空! 什么会导致这种情况?
更新: sorry我好像明白了,我忘了project2里面的方法不是直接调用的,是通过webservice调用的:
await ModMain.objWebService.GetUsersDetailsAsync();
但是如果我立即从 UserFactory 调用我的方法:
UserFactory.GetUsersDetails();
那么 AllActiveUsers 不为空。 这是导致这个问题的原因吗? 也许这个 post 被转换成一个关于从 webservice 调用方法时的问题的信息。
它必须是您初始化列表的地方。你说 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 服务应用程序中的静态变量对工作进程有生命周期 link,因此它们可能会自动重新初始化。它们不应该用于此类应用程序。来源之一:Web service variable shared for the lifetime of the webservice?
一个解决方案可能是使用应用程序状态来存储请求之间的对象:http://www.codeproject.com/Articles/13402/Building-web-services-with-persistent-state