2014-10-08 1 views
0

좋아요. 역 동성 문제가 있습니다 ... 잠재적으로 위험하지만 내 말을 들었습니다. 기본적으로 객체가 있고 고객이라고 부를 수 있습니다.전달 된 유형에 존재해서는 안되는 속성으로 '채워져있는'동적 객체

public class Customer 
{ 
    public int Id { get; set; } 
    public string Type { get; set; } 
    public string Value { get; set; } 
    public bool IsActive { get; set; } 
} 

이 개체에서 상속하는 다른 개체가 있습니다. 그것을 ImportantCustomer라고 부를 수 있습니다.

public class ImportantCustomer : Customer 
{ 
    public int SomeOtherValue { get; set; } 
} 

나는 이제 무엇인가를해야하는 나의 마술을하는 방법을 가지고 있습니다. 이 메소드는 위의 클래스 중 하나에 속하지 않습니다.

public void DoTheMagic(dynamic myObject) 
{ 
    //My magic here 
) 

문제는 레이어가 맨 위로 ImportantCustomer를 가져올 예정이지만 고객 개체를 보내려고합니다. 그것이 내가 원하지 않는 같은 결과 나 그물 일을

var customer = (Customer)importantCustomer; 

또는

Customer customer = importantCustomer; 

또는

ICustomer customer = importantCustomer; 

어느 쪽이든 : 그래서 이런 일을한다. 이제 나는 내 방법으로 보내고 싶은 물건을 가지고 있고 모든 것이 잘되어야한다 (고객). 그러나 내 마술에있는 논리의 일부는 객체 매개 변수가있는 다른 메서드를 호출합니다.

public void SomeOtherMethod(object obj) 
{ 
    //More magic 
) 

이 메서드 내에는 개체의 모든 속성이 있습니다. 어떤 단계를 거치면, 그것은 또한 나에게 중요한 고객 객체에있는 'SomeOtherValue'속성을 제공하지만, 분명히 속성을 구현하지 않는 새 Customer 객체를 전달했습니다. 이 속성이 추가되는 이유는 무엇입니까? 어떻게 이런 일이 일어나는지를 이해하는 데 어떤 종류의 깊은 이해가 있습니까? 고객 유형에 대한 캐스팅으로 인해이 속성이 표시되는 백그라운드에서 참조가 계속 진행되고 있습니까?

나는 그것을 수동 방식으로 할 경우

나는 마법에서 'SomeOtherValue'속성을하지 않는 의미에서 의도 한대로 작동
var customer = new Customer() 
{ 
    Id = importantCustomer.Id, 
    Type = importantCustomer.Type, 
    Value = importantCustomer.Value, 
    IsActive = importantCustomer.IsActive, 
}; 

.

답변/이유를 찾는 데 어려움을 겪고 있습니다. 여기에 답변/설명이 있다면 나는 그것을 놓쳤습니다.

감사합니다.

EDIT 1

SomeOtherValue 속성이 여전히 주조 후이있을 것입니다 왜 이해가 안 돼요. 나는 무슨 일이 참조하는 것을 얻을 수 있지만, 수업 후 나는이 작업을 수행 할 위치를 경우 :이 건물은 고객의 유형에 존재하지 않기 때문에

var customer = (Customer)importantCustomer; 
var value = customer.SomeOtherValue; // ERROR 

컴파일러는 화를 가져옵니다. 나는 캐스팅이 어떻게 작동하는지에 대해 중요한 것을 놓친 것일뿐입니다. 나는 그것이 무엇인지 모릅니다.

업데이트

는 더 좋은 방법은 내가 수동을 작성하지 것이다 AutoMapper 또는 내가 지금 원하는 고객 개체를 얻을 비슷한 사용하는 것보다 다른 있나요?

설명을 위해 @Matt Burland에게 감사드립니다. 통찰력이있었습니다.

답변

3

전달한 개체의 일부이기 때문에 속성이 있습니다. Customer customer = importantCustomer을 수행하면 여전히 ImportantCustomer 인 개체에 대한 참조가 복사됩니다. '수동'전송은 전혀 전송되지 않습니다. 그것은 대상을 복사하고 있습니다. 전송이 복사 중이 아닙니다.

그래서 당신은이 작업을 수행 할 때

Customer customer = importantCustomer; 

그것은 아직도 중요한 고객 및 당신은, 사실, 그것을 다시 캐스팅 할 수 있습니다

ImportantCustomer important = (ImportantCustomer)customer; 

그러나 Customer 실제 Customer이었다 (그렇지 않은 경우 ImportantCustomer) 위의 캐스트는 오류를 발생시킵니다.

속성이 추가되지 않으므로 모든 것이 함께 존재합니다.

참고 :이 작업을 수행 할 수 없습니다

Customer customer = importantCustomer; 
int t = customer.SomeOtherValue; 

을하기 때문에 Customer 당신이 보장하는 모든으로 변수를 입력하면 변수 customerCustomer 객체 또는에서 파생 뭔가를 포함 할 것입니다. 따라서 컴파일러는 변수 customerCustomer의 모든 속성과 메서드가 있다는 것을 알 수 있습니다. 따라서,이 경우 컴파일 오류가 발생합니다. 그렇다고해서 customer의 객체에 SomeOtherValue 속성이 없다는 것을 의미하는 것은 아닙니다.

Customer customer = importantCustomer; 
// ...some code 
customer = new Customer(); 
// ...some more code 
int t = customer.SomeOtherValue; // now this is obviously wrong 

을 그리고 새로운 Customercustomer를 재 할당하는 것은 다른 스레드에서 발생할 수 있음을 염두에 두어야 예를 들어, 당신은이 작업을 수행 할 수 있습니다. 당신은 심지어 디버거에서 그것을 할 수 있습니다.

+0

캐스팅을 수행하면 'var customer = (Customer) importantCustomer'또는 'customer.SomeOtherValue'를 수행 할 수없는 다른 두 가지 방법 중 하나를 사용하면 컴파일러가 화를 낼 수 있고 'WTF를 할 수 없습니다. 그 일종의 오류. 캐스팅이 완료되면 컴파일러에서 해당 속성이나 무언가를 숨 깁니까? – Schanckopotamus

+0

컴파일러는 그 변수에 대해 알고있는 모든 것이'Customer'를 포함하고 있기 때문에 "화를 낼 것"입니다. 그것은 'ImportantCustomer'를 포함하고 있으며 런타임까지 알 수 없다는 것을 모릅니다. –

관련 문제