在项目之间共享变量

5

我有一个包含多个项目的解决方案。其中一个项目被我定义为主要项目,它的类中有一个主方法。

在这个类中,我定义了一些公共静态属性。我想做的是从其他项目文件中访问这些属性。例如:

项目A:

namespace Cobra
{
    public static class Program
    {
        public static int A;
        public static int B;
...

Project B:

namespace Net
{
    public class HttpHandler : IHttpHandler
    {
        ...
        public void ProcessRequest()
        int a =Cobra.Program.A;
        int b =Cobra.Program.B;
...

我该怎么做?
编辑:
如果我在Project B中添加Project A作为引用:「添加此项目作为引用,将出现循环依赖。」
Project B包含其他一些文件,因此需要在Project A中引用Project B。

1
这些项目是否在同一个解决方案中?如果是,只需将该项目作为引用包含进来。如果不是,则可以使用反射来加载 DLL 文件。 - Ivo
是的,但在B中使用Cobra时告诉我找不到类型或命名空间。 - Manu
你是否添加了引用,并且被引用的项目是否能够编译通过,没有出现异常? - Ivo
5个回答

6
在项目 B 中,添加对项目 A 的引用,并在需要访问 Cobra(项目 A)命名空间中的内容时,在项目 B 中添加一个 using Cobra 语句。

这个不起作用。在问这里之前,我已经尝试过了。B中的“using Cobra”告诉我找不到类型或命名空间。 - Manu
3
如果这样做不起作用,那么你可能没有添加引用。 - CodeCaster
当我尝试添加时:"将此项目作为引用添加,会出现循环依赖。" - Manu
那么你已经在项目A中引用了项目B。正如错误所述,你不能这样做。 - CodeCaster
项目B包含一些其他的文件,因此在项目A中引用项目B是必要的。 - Manu
你不能有循环引用,所以你需要改变你的项目布局。 - CodeCaster

5
您需要将A项目添加到B项目的引用中 - 在解决方案资源管理器中右键单击项目节点,选择引用,然后选择项目,再选择A项目即可。
这样您就可以访问A项目中的所有类型了。
请参阅MSDN上的此教程

4

根据你对其他答案的评论,似乎你的问题实际上是需要打破循环依赖。通常的解决方法是将接口分离出来并放入第三个项目中,两个其他项目都可以引用它,这样做代替了

class Foo //foo lives in project 1 (depends on project 2)
{
    public Bar GetNewBar()
    {
        return new Bar(this);
    }
    public void DoSomething(){}
}

public class Bar //bar lives in project 2 (depends on project 1 -- cant do this)
{
    public Bar(Foo parent){}
}

你有

class Foo: IFoo //foo lives in project 1 (depends on project 2 and 3)
{
    public Bar GetNewBar()
    {
        return new Bar(this);
    }
    public void DoSomething(){}
}

public class Bar //bar lives in project 2 (depends on project 3)
{
    public Bar(IFoo parent){}
}

public interface IFoo //IFoo lives in project 3 (depends on nothing)
{
    void DoSomething();
}

1

@Manu,

通过反射是可以实现的。以下是解决您问题的方法。

您创建了2个项目

项目B - 具有命名空间“Net”,类“HttpHandler”

项目A - 具有命名空间“cobra”,静态类“Program”,并引用了项目B

现在您的问题是,您需要访问项目B中的“Program”类,而不给项目B引用项目A,因为这样会导致循环引用错误,无法构建解决方案。

请查看以下内容

项目A

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Net;
namespace Cobra { public static class Program { public static int A { get; set; } //Getter/Setter很重要,否则“GetProperties”将无法检测到它 public static int B { get; set; }
static void Main(string[] args) { HttpHandler obj = new HttpHandler(); obj.ProcessRequest(typeof(Program)); } } }

项目B

使用System命名空间包含一系列类, 可以用于访问和操作运行时环境、处理文本、序列化和反序列化对象等。其中,HttpHandler是继承自IHttpHandler的一个公共类,其中ProcessRequest方法接受一个Type类型参数,代表要处理的Cobra类型对象。在该方法中,我们使用foreach语句遍历Cobra类型对象的属性,并通过GetValue方法获取其值。其中,当属性名为"A"时,将其转换成整型并赋值给变量a;当属性名为"B"时,则赋值给变量b。

0
你需要在项目B的文件顶部添加一个using指令:
using Cobra;

在项目B中添加项目A作为引用。

当我尝试添加引用时:“将此项目作为引用添加,会出现循环依赖关系。” - Manu
正如@CodeCaster在他的回复中所说:那么你已经在项目A中引用了项目B。正如错误所述,你不能这样做。 - Tim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接