값 직렬화를위한 도구를 작성하려고합니다. 그리고 나는 좋은 구문이 작동하기를 바라고 있었다 .....
float f = 9999.0f;
ByteSerializer s = new ByteSerializer ();
s.Write(f);
Write ()의 매개 변수는 임의의 숫자가 될 수 있습니다.
public void Write (params dynamic[] objects)
{
for (int i =0;i<objects.Length;i++) {
byteList.AddRange (GetBytes (objects[i]));
}
}
이제 전달 된 개체의 유형에 따라 GetBytes ()를 호출해야합니다.
public byte[] GetBytes ( object v)
{
//Shouldn't actually do anything since it's a dummy
return new byte[0];
}
public byte[] GetBytes ( System.Single v)
{
//Why is this not called?
return BitConverter.GetBytes (v);
}
그러나 개체를 매개 변수로 사용하는 메서드는 항상 곧바로 진행됩니다. 처음에는 (params object [])를 메서드 매개 변수로 시도했는데이 동작이 다소 분명하다는 것을 알았습니다. 그런데 dynamic []이 똑같이 작동하는 이유는 무엇입니까?
objects [i] .GetType ()은 System.Single을보고합니다. 그래서 여기서 무슨 일이 일어나고 있습니까? 내가하려는 것이 가능하지 않습니까?
메서드 오버로딩은 컴파일 타임 에 모든 인수의 유형 을 알고 있어야합니다. 여기에서는 컴파일 타임에 인수 유형을 알 수 없습니다. 왜냐하면 dynamic
컴파일러가 가장 낮은 공통 유형 인 object
. 의 차이 object
와는 dynamic
즉 dynamic
후반 구문을 결합 할 수 있습니다 -하지만 여기에 도움이되지 않습니다.
GetBytes
올바른 유형 을 호출 하려면 reflection 을 사용해야 합니다 . 특히 GetMethod 를 사용 GetBytes
하여 각 인수의 유형과 일치 하는 오버로드를 찾은 다음 호출하려고합니다. 로 호출 . 다음과 같은 것 (테스트되지 않음) :
byteList.AddRange (GetType()
.GetMethod("GetBytes", new Type[objects[i].GetType()])
.Invoke(null, new object[objects[i]]));
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다