좋아요. 역 동성 문제가 있습니다 ... 잠재적으로 위험하지만 내 말을 들었습니다. 기본적으로 객체가 있고 고객이라고 부를 수 있습니다.전달 된 유형에 존재해서는 안되는 속성으로 '채워져있는'동적 객체
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에게 감사드립니다. 통찰력이있었습니다.
캐스팅을 수행하면 'var customer = (Customer) importantCustomer'또는 'customer.SomeOtherValue'를 수행 할 수없는 다른 두 가지 방법 중 하나를 사용하면 컴파일러가 화를 낼 수 있고 'WTF를 할 수 없습니다. 그 일종의 오류. 캐스팅이 완료되면 컴파일러에서 해당 속성이나 무언가를 숨 깁니까? – Schanckopotamus
컴파일러는 그 변수에 대해 알고있는 모든 것이'Customer'를 포함하고 있기 때문에 "화를 낼 것"입니다. 그것은 'ImportantCustomer'를 포함하고 있으며 런타임까지 알 수 없다는 것을 모릅니다. –