Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用InternalsVisibleTo而不创建循环引用_C#_.net_Reflection - Fatal编程技术网

C# 如何使用InternalsVisibleTo而不创建循环引用

C# 如何使用InternalsVisibleTo而不创建循环引用,c#,.net,reflection,C#,.net,Reflection,我对InternalsVisibleTo的理解是,它主要用于单元测试。但是这意味着我的单元测试类,如果它在一个单独的项目中,需要一个对包含InternalsVisibleTo类的项目的引用,并且该类还需要一个对单元测试类的引用,以便将其程序集名称放入属性的参数中 如何解决这一难题?考虑以下项目结构 您有一个名为Company.Org.PersonManager的项目,正在构建一个名为 Company.Org.PersonManager.dll 它包含以下类声明 internal class P

我对
InternalsVisibleTo
的理解是,它主要用于单元测试。但是这意味着我的单元测试类,如果它在一个单独的项目中,需要一个对包含
InternalsVisibleTo
类的项目的引用,并且该类还需要一个对单元测试类的引用,以便将其程序集名称放入属性的参数中


如何解决这一难题?

考虑以下项目结构

您有一个名为
Company.Org.PersonManager
的项目,正在构建一个名为

Company.Org.PersonManager.dll
它包含以下类声明

internal class Person
{
    public string Foo();
}
如果要测试Foo方法,可以在名为
Company.Org.PersonManager.test的项目中编写nunit测试

实现可能类似于:

[TestFixture]
public class TestPersonManager
{
    [Test]
    public void Test_Foo()
    {
        Person p = new Person();
        Assert(p .... );
    }
}
上面的代码不会编译,因为Person类仅在assembly
Company.Org.PersonManager.dll中内部可见

如果您添加以下行,
InternalsVisibleTo
就是在这里派上用场的

[assembly: InternalsVisibleTo("Company.Org.PersonManager.Test.dll")]
对于项目
Company.Org.PersonManager
中的
Properties/AssemblyInfo.cs
,您告诉编译器程序集
Company.Org.PersonManager.Test.dll
可以访问程序集中的内部类和方法
Company.Org.PersonManager.dll


这不应导致循环引用,
Company.Org.PersonManager.Test
应具有对
Company.Org.PersonManager
的引用,但不需要其他引用。

测试中的程序集(使用您正在测试的类)不需要对UT程序集的引用。它只需要在
[InternalsVisibleTo]
中提到它的名字。什么是第22条军规?你试过了吗?您不需要仅仅为了获得单元测试程序集的名称而引用它。您知道程序集的名称…只需将其传递给属性。如果你上班有困难,那是因为你做错了,而不是因为有强制性的循环参考。如果你想不出答案,就发布一个新问题,其中包括一个可靠地再现问题的好问题,准确地解释你试图解决它的原因,以及给你带来麻烦的具体原因。