2009-07-23 9 views
4

형식을 사용하는 일반 정적 클래스를 사용하여 C# 웹 서비스에서 작업하고 있습니다.변수에 형식을 할당하고 일반 정적 클래스로 변수를 사용합니다.

The type or namespace name 'type1' could not be found (are you missing a using directive or an assembly reference?)

그리고 ReSharper에서, 나는 코드의 두 번째 줄에 type1 위에 마우스를 올려 때, 유형 또는 네임 스페이스 이름 기대 "라고 :이 오류를 제공

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

:이 컴파일되지 않는 이유를 궁금 해서요 ". 음, 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#이 정적으로 형식화 된 언어라는 것"입니다. 이제 루비가 저를 망쳤다는 것을 알았습니다. ;)

+0

/나를 괴롭 히다/나에게 나쁜 매너를 가르쳤다. ;;-) – Thorarin

답변

3

우선 ReSharper가 실제로 맞습니다. 유형이이 아니며 변수입니다. 그것은 유형에 해당하는 반사 객체를 보유하고있는 변수이지만 충분하지 않습니다.

< ...> 대괄호 사이에는 다른 식별자의 이름이 아닌 유형 이름을 써야합니다.

리플렉션을 통해 일반 객체를 구성 할 수 있지만 정적 객체 인 경우에도 해당 속성에 액세스 할 수 있으므로 코드를 다시 작성할 수 있어야하지만 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); 
    } 
} 
3

컴파일 시간은이고 일반 형식은 런타임 인 ​​이 아닙니다. 런타임에 어떤 type1이 될지 결정할 수 없기 때문에이 구성은 허용되지 않습니다.

이것은 실제로 Resharper가 말한 것입니다. type1은 유형이 아니며 Type 유형의 변수입니다 (String 유형의 개체 일 수 있음).

+0

어, 당신이 말하고자했던 것을 바꿨습니까? 어쩌면 "일반 유형은 _compile time_이 아닌 _runtime_에서 평가됩니다." –

+0

또한 typeof (MySnazzyType)로 작성 되었기 때문에 컴파일 유형에서 'type1'이 무엇인지 결정할 수없는 이유는 무엇입니까? –

+1

아니요, 그는 올바르게 작성했습니다. 귀하의 경우 일반적인 유형은'ConnectionPool_Accessor <>'이며, 그것은 실제로 컴파일 타임에 해결됩니다. 그리고 그 시점에서'type1'이 어떤 타입을 해결할 것인지를 알 수있는 방법이 없습니다. 본질적으로 문제는 C#이 정적으로 형식화 된 언어라는 것입니다. –

1

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 동적 타이핑을 사용하지 않는다면 엉덩이에 큰 고통이 될 것입니다.