2016-07-14 2 views
0

나는 외부 라이브러리, 즉 , Aspose.Email.dll (NuGet에서 사용 가능)을 사용하고 있습니다. 그것은 PageInfo 클래스입니다.리플렉션을 사용하여이 객체의 속성을 설정하려면 어떻게해야합니까?

using System; 

namespace Aspose.Email 
{ 
    public class PageInfo 
    { 
     protected PageInfo next; 

     public int AbsoluteOffset { get; } 
     public int ItemsPerPage { get; } 
     public bool LastPage { get; } 
     public virtual PageInfo NextPage { get; } 
     public int PageOffset { get; } 
     public int TotalCount { get; } 
    } 
} 

길고도 짧은 이야기, 나는 PageInfo 객체를 생성해야합니다 정의로 이동하면 비주얼 스튜디오에 대해 다음을 보여줍니다. Reflection을 사용하여 어떻게 생성하고 ItemsPerPage 속성을 설정할 수 있습니까?

나는 이것을 시도 :

var result = (PageInfo)FormatterServices.GetUninitializedObject(typeof(PageInfo)); 
typeof(PageInfo).GetProperty("ItemsPerPage", BindingFlags.Instance | BindingFlags.Public).SetValue(result, 1); 

문제는 Property set method not found.

+0

'PageInfo'를 작성해야하는 이유는 무엇입니까? 아마도 * "내 PageInfo를 크래킹하지 않고 어떻게 X를 할 수 있습니까?"*에 대한 새로운 질문을 던지십시오. * 리플렉션을 사용하는 것보다 더 좋은 해결책이있을 수 있습니다. –

+0

누군가 묻을 까봐 두려웠습니다. 나는 추상적 인 인터페이스 라이브러리를 프로그래밍하여 두 개의 서로 다른 메일 라이브러리를 통합하고있다.이 라이브러리와 Exchange 라이브러리를 함께 사용하여이 둘 사이에 페이징 데이터를 통합하려고한다. 불행히도이 IMAP 라이브러리의 큰 경고는 실제로 임의의 페이징 쿼리를 작성할 수는 없지만 먼저 페이징 된 데이터를 얻기 위해 호출 한 후에 항상 링크 된 페이징 개체를 사용해야한다는 것입니다. 라이브러리의 본질과 API가 구현되어서 약간의 고통이됩니다. – Alexandru

답변

1

게터 전용 특성을 가진 SetValue 오류 아웃 세터가없는 것입니다. 그들은 생성자에서만 설정할 수있는 readonly 뒷받침 필드를 사용합니다.

속성을 개인 설정자로 변경할 수 있습니다 (예 : 당신이 코드에 액세스 할 수없는 경우

public int ItemsPerPage { get; private set; } 

, 당신은 GetField를 사용하여 일치하는 분야를 찾아 그 값을 설정할 수 있습니다.

typeof(PageInfo).GetTypeInfo().DeclaredFields 
    .First(f => f.Name.Contains("ItemsPerPage")).SetValue(result, 1); 
+0

소스가 없으므로 라이브러리를 변경할 수 없으므로'ItemsPerPage' 속성을 편집 할 수 없습니다. – Alexandru

+0

@Alexandru 대답을 업데이트했습니다. 그것을 밖으로 시도하십시오. –

+0

* dotPeek *을 사용하여 라이브러리를 확인하고'DeclaredFields'를 통해 열거하는 중 ... 나는 이름이 들어간 필드에'# = qOeu6uj6DPtGwJ1qAj8pvJQ =='와'# # = qQACP_gKR9skNS8JCd3aPRw ==', 나는 그들이 라이브러리의 각 버전에 대해 무언가를 해싱하고 있다고 믿게합니다. 업그레이드 능력이 창문 밖으로 나옵니다. – Alexandru

관련 문제