2015-01-13 2 views
1

Object Oriented Programming 언어의 시작 프로그래머이기 때문에, 최근에 C#을 사용했습니다. 현재 다음과 같은 웹 응용 프로그램을 만들고 있습니다 :C#의 메서드에서 클래스 이름을 매개 변수로 사용하려면 어떻게해야합니까?

웹 페이지는 MongoDB 데이터베이스의 결과로 채워지는 여러 개의 드롭 다운 메뉴로 구성되어 있습니다. 이 데이터베이스에는 각각 8 개의 컬렉션이 있는데, 각각은 7 개의 속성 (및 컬렉션 이름)을 가진 개체의 알 수없는 양입니다. 아래와 같이 나는 컬렉션 사이의 유사성의 모든 인터페이스를 사용하고 있습니다 :

namespace TestMVC.Models 
{ 
    public interface Product 
    { 
     string collectionName; 
     ObjectId Id { get; set; } 
     double Prijs { get; set; } 
     string Productlink { get; set; } 
     string Productnaam { get; set; } 
    } 
} 

후 나는 아래의 코드를 사용하여 특정 집합의 각각의 모든 기록을 보여주기 위해 선택 쿼리를 수행하고 싶습니다 :

var collection = DatabaseConnect().GetCollection<Product>(collectionName); 
var query = 
from Product in collection.AsQueryable<Product>() 
orderby Product.Prijs 
select Product; 
foreach (Product prd in query){ 
    //... Do something 
} 

여기가 내 문제가 시작되는 곳입니다. 런타임 중에 어떤 콜렉션이 검색되는지 미리 알지 못하기 때문에 데이터베이스의 8 가지 콜렉션 모두를 처리 할 수있는 2 개의 매개 변수로 일반 함수를 작성하려고합니다.

public string databaseResult(string collectionName, Type className) 

내가 사용하여 전화 : 내가 위에서 언급 한 코드로 모든이를 주입 그래서

databaseResult('motherboards', typeof(Motherboards)); 

, 나는 말을 다음 줄

var collection = DatabaseConnect().GetCollection<className>(collectionName); 

에 오류가 발생합니다 :

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

분명히 어느 것 코드가 매개 변수에 명시된 클래스 이름으로 <> 기호 사이의 "className"을 처리하지 않는다는 것을 의미합니다. 따라서 이것이 내 문제입니다.

"클래스"가 유형이 아니기 때문에 분명히 작동하지 않는 매개 변수에 "유형"대신 "클래스"를 사용하려고 시도했습니다. 스택 오버플로에 대해 조금 살펴 보았고 typeof를 사용하여 클래스 이름을 반환하는 방법을 배웠습니다.이 클래스는 해당 클래스의 객체를 인스턴스화해야하는 경우에만 유용합니다. 불행하게도 MongoDB는 클래스의 인스턴스와 제대로 작동하지 않습니다. 클래스 자체와 함께 작업해야합니다 (아는 한).

위의 단락은 내가 몇 가지 연구를 직접 해본 것을 보여 주지만 msdn.com에서 제시 한 C# 전문 용어를 이해하지 못함을 나타냅니다. 나는이 코드 작업을하기 위해 무엇을해야하는지, 그리고 왜 후자에 대한 설명을하고 있는지 이해할 수있는 대답을 찾고있다. (나는 전에 언급 한 전문 용어 msdn.com이없는 것이 좋다.)

오랫동안 읽지 못해 사과드립니다.하지만 누군가가 기꺼이 도와 주길 바랍니다. 미리 감사드립니다.

답변

2

이 경우 generics을 사용해야합니다.

public string DatabaseResult<T>(string collectionName) 
    where T : IProduct 
{ 
    var collection = DatabaseConnect().GetCollection<T>(collectionName); 
    // ... 
} 

는이 같은이 호출이 예 T에서

DatabaseResult<Motherboard>("motherboards"); 

이 유형에 대한 자리 표시 자입니다. 그것은 Motherboard로 대체됩니다.

where T : IProduct 절에 유의하십시오.IProduct을 구현하는 클래스 만 허용하도록 T에 대한 제약 조건을 설정합니다.

을 유형 이름이 필요한 위치 (예 : typeof(T))에 사용할 수 있기 때문에 효과가 있습니다. 반면에 코드에 Type className 매개 변수를 사용하면 className은 다른 매개 변수와 동일합니다. Type 클래스는 어떤 식 으로든 특수하게 만들지 않으므로 형식 이름이 일 것으로 예상되므로 Type 인스턴스에 대한 참조를 보유하는 변수가 없으므로 typeof(className) 또는 GetCollection<className>을 쓸 수 없습니다.

또한 C#의 규칙에 따라 인터페이스는 I (즉 IProduct)으로 시작해야하며 메서드 이름은 PascalCased 여야합니다.

+0

내가 정확히 무엇을 요청했는지 알려 주셨습니다. 고맙습니다. 다른 사람들도이 스레드를 유용하게 사용할 수 있기를 바랍니다. 당신 덕택에 프로그래밍에 좀 더 자신감을 가질 수 있습니다. 내가 사용한 관례에 대한 피드백 또한 매우 유용합니다. –

관련 문제