변수에 유형을 할당하고 일반적인 정적 클래스와 함께 변수를 사용하십시오.

StackOverflow https://stackoverflow.com/questions/1174635

문제

유형을 취하는 일반적인 정적 클래스가있는 C# 웹 서비스에서 작업하고 있습니다. 왜 이것이 컴파일되지 않는지 궁금합니다.

Type type1 = typeof(MySnazzyType);
Assert.AreEqual(0, ConnectionPool_Accessor<type1>._pool.Count);

이 오류가 발생합니다.

유형 또는 네임 스페이스 이름 'Type1'을 찾을 수 없습니다 (사용 지시서 또는 어셈블리 참조를 사용하지 않습니까?)

그리고 내가 맴돌 때 type1 이 두 번째 코드 라인에서 "유형 또는 네임 스페이스 이름이 예상됩니다"라고 말합니다. 잘, type1 ~이다 유형! 유형의 변수입니다 Type! 내가하는 경우에도 작동하지 않습니다.

Type type1 = typeof(MySnazzyType);
Assert.AreEqual(0, ConnectionPool_Accessor<typeof(type1)>._pool.Count);

나는 내 유형을 몇 가지 다른 것에 할당하기를 바랐다. Type 변수를 입력하는 대신 다른 일반 정적 클래스를 테스트하는 데 사용됩니다. MySnazzyType 매번. 어떤 아이디어라도, 또는 내가하는 일에 집착하고 있습니까?

Assert.AreEqual(0, ConnectionPool_Accessor<MySnazzyType>._pool.Count);

편집하다: 명확히하기 위해 MySnazzyType ~이다 ~ 아니다 일반적인 클래스, 일반 클래스에서 물려받지 않습니다. 여기서 유일한 일반적인 클래스는입니다 ConnectionPool_Accessor.

Pavel의 의견 덕분에 "본질적으로, 당신의 문제는 C#이 정적으로 입력 한 언어라는 것입니다." ;)

도움이 되었습니까?

해결책

우선, rostharper는 실제로 정확합니다. 그것은 아닙니다 유형, 그것은 a입니다 변하기 쉬운. 물론, 그것은 유형에 해당하는 반사 객체를 보유하고 있지만 충분하지 않은 변수입니다.

<...> 괄호 사이에서 다른 식별자의 이름이 아닌 유형의 이름을 작성해야합니다.

그러나 반사를 통해 일반적인 객체를 구성하고 속성에 액세스 할 수 있으므로 코드를 다시 쓸 수 있지만 Nunit 2.5를 살펴 보셨습니까?

최신 릴리스 노트에서, 단위 테스트 클래스는 이제 일반적인 것으로 보이며 테스트 클래스에 테스트 할 유형의 속성으로 지정할 수 있습니다.

이것은 당신이 이와 같은 것을 쓸 수있게 해줄 것입니다 (참고, 이것을 테스트하지 않았습니다. 문서의 새로운 속성의 이름 만 찾았습니다).

[TestFixture(typeof(MySnazzyType))]
[TestFixture(typeof(MyOtherSnazzyType))]
public class Tests<T>
{
    [Test]
    public void PoolCount_IsZero()
    {
        Assert.AreEqual(0, ConnectionPool_Accessor<T>._pool.Count);
    }
}

다른 팁

일반 유형은 평가됩니다 시간을 컴파일하십시오, 안에 실행 시간. 런타임 시간에 결정할 수 없기 때문입니다 type1 이 구성은 허용되지 않습니다.

이것은 실제로 Resharper의 말입니다. type1 유형이 아니며 유형의 변수입니다. Type, (유형의 객체가 될 수있는 것처럼 String).

그만큼 TestFixture 속성은 당신을 설정해야하지만, 그것을 위해서만 : 런타임 에이 모든 것을하고 싶다면 반사를 사용하여 할 수 있습니다.

Type poolType = typeof(ConnectionPool_Accessor<>);
Type snazzyType = typeof(MySnazzyType); // Or however you want to get the appropriate Type
poolType.MakeGenericType(snazzyType);

그런 다음 반사를 사용하여 원하는대로 수행 할 수 있습니다. poolType. 물론 C# 4.0 동적 타이핑을 사용하지 않으면 엉덩이에 큰 고통이 될 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top