2012-10-11 2 views
0

내 웹 페이지의 백엔드는 쿼리 문자열에서받는 값에 따라 다른 클래스를로드해야합니다. 클래스를 인스턴스화 할 수 있도록 다른 모든 필요한 매개 변수가 있는지 확인하는 방법이 필요합니다.인스턴스화하지 않고 클래스에서 매개 변수 이름을 가져올 수 있습니까?

는 여기에 옷을 벗었 예제 :

두 클래스, CarCycle 모두 Vehicle에서 상속합니다.

Public Class Car 
    Inherits Vehicle 

    Private Const _wheels as Int = 4 
    Private _transmission as string 
    Private _mpg as int 

    Public Sub New(Byval transmission as string, Byval mpg as int) 
     _transmission = transmission 
     _mpg = mpg 
    End Sub 
End Class 

Public Class Cycle 
    Inherits Vehicle 

    Private Const _wheels as Int = 2 
    Private _gears as Int 

    Public Sub New(ByVal gears as Int) 
     _gears = gears     
    End Sub 
End Class 

이 내 쿼리 문자열입니다 : 타입 = 자동차 & 전송 = 자동

그래서 나는 유형이 무엇인지 알고 있지만, 나는 내가해야 할 mpg의 세부 사항이 제공되지 않은 클래스를 인스턴스화 할 수 있습니다.

"수동"쿼리 문자열을 구문 분석과 같은 작성하는 것이이 작업을 수행하는 방법 :

if not string.isNullOrEmpty(transmission) and not string.isNullOrEmpty(mpg) then 
    dim c as new Car(transmission, mpg) 
end if 

을하지만, 매개 변수가 많이있는 경우이 지저분 얻을 수 있습니다. 또한 클래스 객체를 편집 할 때 유지 관리하기가 더 어렵습니다.

나는 라고 생각합니다. 클래스에 필요한 각 매개 변수의 이름을 가져 와서 쿼리 문자열에 있는지 확인하고 싶습니다. 그러나 클래스를 인스턴스화하기 전에이 작업을 수행해야합니다. 그게 가능한지 확실하지 않습니다.

이렇게하는 것이 현명한 방법입니까? 단지 모든 매개 변수를 작성하는 것보다 더 똑똑한 방법이 있습니까?

이 질문의 코드는 vb.net로 작성되었습니다하지만 난 당신도 쿼리 문자열에서 동적으로 차량 개체를 만들 수 있습니다 C#을

답변

2
var queryParams = HttpUtility.ParseQueryString("?type=car&transmission=automatic"); 

Type type = typeof(Car); 

bool canCreate = type.GetConstructors() 
       .Any(c => c.GetParameters().All(p => queryParams[p.Name] != null)); 

에 답을 논의 드리겠습니다.

var queryParams = HttpUtility.ParseQueryString("?type=car&transmission=automatic&mpg=12"); 

Dictionary<string, Type> types = new Dictionary<string, Type>() 
{ 
    {"car",typeof(Car)}, 
    {"cycle",typeof(Cycle)} 

}; 

Type vehicleType = types[queryParams["type"]]; 

var cInfo = vehicleType.GetConstructors() 
     .FirstOrDefault(c => c.GetParameters().All(p => queryParams[p.Name] != null)); 

if (cInfo != null) 
{ 
    var cParams= cInfo.GetParameters() 
         .Select(p => Convert.ChangeType(queryParams[p.Name], p.ParameterType)) 
         .ToArray(); 

    object vehicle = Activator.CreateInstance(vehicleType, cParams); 
} 
+0

지금은 영리합니다. –

1

아마도 Activator 객체를 사용해 볼 수 있습니까? 이 (C 번호)와 같은 뭔가 :

(T)Activator.CreateInstance(typeof(T), p1, p2); 

T는 클래스 매개 변수를 선택하기 만의 ctor에 널 위해 그들을 테스트하고 예외 경우를 던져, 그리고 당신의 유형 (자동차 등)

입니다 그들은 다음과 같습니다 :

Public Sub New(Optional Byval transmission as string, Optional Byval mpg as int)  

if string.isNullOrEmpty(transmission) then 
    throw exception .... 
end if 
    _transmission = transmission     
    _mpg = mpg    
End Sub 

마지막으로 예외를 처리하고 계속 진행하십시오. 그냥 생각 ...

관련 문제