C# c中每个类的引用#

C# c中每个类的引用#,c#,visual-studio,C#,Visual Studio,我正在使用visual studio创建windows应用程序,我遇到以下问题 我得到一个循环依赖项错误,因为我有以下设置: project1.classA.cs project2.classB.cs project2.classC.cs 现在,classB有一个classA的成员,所以我添加了对project1的引用。现在我想让类A在类C中使用静态函数。但是,由于循环依赖关系,我无法添加对project2的引用。有什么方法可以解决这个问题而不需要我创建一个新项目吗?我认为您最好提取常用方法

我正在使用visual studio创建windows应用程序,我遇到以下问题

我得到一个循环依赖项错误,因为我有以下设置:

project1.classA.cs

project2.classB.cs
project2.classC.cs

现在,classB有一个classA的成员,所以我添加了对project1的引用。现在我想让类A在类C中使用静态函数。但是,由于循环依赖关系,我无法添加对project2的引用。有什么方法可以解决这个问题而不需要我创建一个新项目吗?

我认为您最好提取常用方法和接口,并将它们放在一个单独的类库中

但是,通过为C类创建接口并将其放入项目1中,可以在不编写新类库的情况下实现这一点:

public interface IClassC
{
    void Method1();
    void Method2();
}
然后在项目1中,可以使用依赖项注入将其传递给
ClassA
构造函数:

public class ClassA
{
    readonly IClassC _methodsFromClassC;

    public ClassA(IClassC methodsFromClassC)
    {
        _methodsFromClassC = methodsFromClassC;
    }

    public void SomeMethod()
    {
        _methodsFromClassC.Method1();
        _methodsFromClassC.Method2();
    }
}
然后在项目2中,您需要使用静态
ClassC
实现该接口:

public static class ClassC
{
    public static void Method1()
    {
        Console.WriteLine("ClassC.Method1()");
    }

    public static void Method2()
    {
        Console.WriteLine("ClassC.Method2()");
    }
}

public class ClassCImpl : IClassC
{
    public void Method1()
    {
        ClassC.Method1();
    }

    public void Method2()
    {
        ClassC.Method2();
    }
}
然后,当您创建
ClassA
的实例时,必须传递
ClassCImpl
的实例:

var classA = new ClassA(new ClassCImpl());

但是,重申一下:您应该创建一个单独的类库来保存共享接口和类。

我认为您最好提取通用方法和接口,并将它们放在一个单独的类库中

但是,通过为C类创建接口并将其放入项目1中,可以在不编写新类库的情况下实现这一点:

public interface IClassC
{
    void Method1();
    void Method2();
}
然后在项目1中,可以使用依赖项注入将其传递给
ClassA
构造函数:

public class ClassA
{
    readonly IClassC _methodsFromClassC;

    public ClassA(IClassC methodsFromClassC)
    {
        _methodsFromClassC = methodsFromClassC;
    }

    public void SomeMethod()
    {
        _methodsFromClassC.Method1();
        _methodsFromClassC.Method2();
    }
}
然后在项目2中,您需要使用静态
ClassC
实现该接口:

public static class ClassC
{
    public static void Method1()
    {
        Console.WriteLine("ClassC.Method1()");
    }

    public static void Method2()
    {
        Console.WriteLine("ClassC.Method2()");
    }
}

public class ClassCImpl : IClassC
{
    public void Method1()
    {
        ClassC.Method1();
    }

    public void Method2()
    {
        ClassC.Method2();
    }
}
然后,当您创建
ClassA
的实例时,必须传递
ClassCImpl
的实例:

var classA = new ClassA(new ClassCImpl());

但是,重申一下:您应该创建一个单独的类库来保存共享的接口和类。

这不是一个很好的情况,但是您不想创建一个新项目这一事实让我相信您已经考虑了所有合理的选项

我认为留给您的唯一选项是将文件
project2.classC.cs
本身添加到
project1
,但请确保勾选“选择”对话框中的“包含为链接”选项,以便您不制作副本。这不好,但应该有用


右键单击项目,选择
Add
->
Existing Item
,选择文件,然后单击
Add
按钮右侧的下拉列表,然后选择
Add as Link

,这不是一个很好的情况,但事实上,你不想创建一个新项目,这让我相信你已经考虑了所有明智的选择

我认为留给您的唯一选项是将文件
project2.classC.cs
本身添加到
project1
,但请确保勾选“选择”对话框中的“包含为链接”选项,以便您不制作副本。这不好,但应该有用


右键单击项目,选择
添加
->
现有项
,选择文件,然后单击
添加
按钮右侧的下拉列表,选择
添加为链接

为每个类添加类的代码,请?尝试搜索c#循环依赖接口。程序集之间可以有循环引用,但不能依赖VS来帮助您,您需要自定义构建,并且必须对类进行重大更改。在你走上这条路之前,确保你真的需要这个。你是否使用了一个奇怪的VS版本,你必须为你创建的每个项目支付费用?这是一个如何创建两个相互引用程序集的示例。虽然这不是一个真正的答案,但如果您发现自己处于这样的位置,则意味着您混淆了各个项目的目的。换句话说,应该避免这种情况。最简单的解决方案是将通用元素移动到一个单独的、更全局的项目中,或者重新考虑您的代码结构。请为每个类添加类的代码?尝试搜索c#循环依赖接口。您可以在程序集之间使用循环引用,但不能依赖VS来帮助您,您需要自定义构建,以及必须对课程进行重大修改。在你走上这条路之前,确保你真的需要这个。你是否使用了一个奇怪的VS版本,你必须为你创建的每个项目支付费用?这是一个如何创建两个相互引用程序集的示例。虽然这不是一个真正的答案,但如果您发现自己处于这样的位置,则意味着您混淆了各个项目的目的。换句话说,应该避免这种情况。最简单的解决方案是将公共元素移动到一个单独的、更全局的项目中,或者重新考虑您的代码结构。这里的接口选项似乎不可行,因为他们说他们在
ClassC
@Damien>中调用
静态
函数。它使用class
ClassCImpl
在static
ClassC
中包装对静态方法的调用,并将
ClassCImpl
的一个实例传递给
ClassA
构造函数。这里的接口选项似乎不可行,因为他们说他们在
ClassC
@Damien>中调用
static
函数。不相信我的人看看我发布的代码。它使用类
ClassCImpl
将对静态
ClassC
中静态方法的调用包装起来,并将
ClassCImpl
的实例传递给
ClassA
构造函数。