2012-07-06 1 views
0

내 함수는 'type'매개 변수 인 'value'매개 변수를받습니다. 개체의 멤버에게 할당하려고하지만 캐스트가 암시 적으로 발생하지 않으므로 명시 적으로 지정해야합니다. 그러나, 나는 실제로 객체에 해당 멤버의 현재 유형을 지정하지 않기 때문에 나는이 작업을 수행 할 수 있습니다 :(C#)로 캐스팅 할 형식을 동적으로 결정합니다.

positiveOrder.OrderID = (int)value; 

하지만, 비즈니스 요구 사항의 변화와 OrderIDs를 발생시켜 다른 방식으로 저장되어있는 경우, 예를 들어 GUIDS의 Strings에 대한 유형 변경을 포함하여 여기서 다시 와서 변경해야합니다. 이는 바람직하지 않은 결합입니다. 나는

positiveOrder.OrderID = value as thisOrder.OrderID.GetType(); 

또는

positiveOrder.OrderID = (typeof(thisOrder.OrderID)) value; 

같은 코드의 다양한 순열을 실험했다 그러나 아무것도 작동하는 것 같다. 프로그래밍 방식으로 변환 할 형식을 지정하는 방법에 대한 아이디어가 있습니까? Order 클래스가 변경되지 않기 때문에 컴파일 타임이나 런타임에 수행 할 수 있습니다. 같은

+2

"내일 주문 클래스를 변경하여 OrderID 멤버를 String으로 저장합니다."왜 이렇게할까요? 그리고 이것은 '가치'의 유형에 어떻게 영향을 미칩니 까? – Codesleuth

+0

값은 항상 내가 제어하지 않는 코드에 의해 객체로 전송됩니다. 이 코드는 구현 세부 사항을 인식하지 못하기 때문에 전송하면 전송됩니다. 변화하는 비즈니스 요구 사항에 따라 OrderID 유형을 변경해야 할 수도 있습니다. 지금은 모형에 간단한 증분 정수를 사용하고 있지만 최종 응용 프로그램에서는 대신 문자열을 사용할 수 있습니다. OrderID 유형을 두 번 지정하여 반복하지 않으려 고합니다. 변경해야 할 경우 두 번 변경하지 않아도됩니다. 이것은 기능적 문제보다 좋은 설계 문제입니다. – Neil

답변

2

positiveOrder.OrderID 경우는 항상있을 것입니다 (문자열로 표현하는 경우에도)의 정수, 정수 아무것도하지만 할 구성원을 변경하지 마십시오. 대신 다른 소스 유형을 처리 할 수있는 몇 가지 메소드를 노출하십시오. 예를 들어

:

public void SetOrderID(object value) 
{ 
    this.OrderID = Convert.ToInt32(value); 
} 

Convert.ToInt32()를 참조하십시오.

+0

codesleuth에게 감사의 말을 전합니다. 그러나 질문에 대한 제 의견에서 볼 수 있듯이, 이것은 아닙니다. 나는 내가 준비하기를 바란다. 이 캐스팅을 기본 형식 인 OrderID에 대해 불가지론 적으로 사용하기를 원합니다. 필요에 따라 형식 및 종류 (텍스트, 숫자, GUID)에 관계없이 변경할 수 있습니다. 그러나 실제 ID가 그대로 유지된다면 실제 표현이 바뀌고 int로 변환하면 올바른 방법이 될 것입니다. – Neil

+0

실제로이 사실이 저를 생각하게 만들었고 여러분이 옳다면, 캐스팅을 수행하는 Order 클래스에 setter 함수를 포함시킬 수있었습니다. 그것은 여전히 ​​두 번 OrderID의 유형을 언급 할거야 적어도 그것은 같은 클래스에있을거야! 형식간에 변환해야하는 메서드를 찾았지만 이상한 이유로 변환을 필요로합니다 (Convert.ChangeType). 나는이 해결책이 무언가에 대한 문제를 해결하기위한 최소한의 오버 헤드라고 생각한다. – Neil

0

뭔가 :

using System.Reflection; 

receiver.GetType().GetProperty(propName).SetValue(receiver, value, null); 
+0

고마워, 나는 당신의 코드가 처음에 무엇을하고 있었는지 알지 못했지만,이 질문에 도달하기 위해 좋은 구글 사료를 주었다 : http://stackoverflow.com/questions/7616177/convert-to-a-type- on-the-fly-in-c-net이 필요합니다. 이제 시도해보십시오. – Neil

관련 문제