2016-07-14 1 views
0

J'ai une bibliothèque externe que j'utilise, à savoir Aspose.Email.dll (disponible sur NuGet). Il a une classe PageInfo. Aller à la définition montre ce qui suit pour en Visual Studio:Comment utiliser la réflexion pour définir la propriété de cet objet?

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; } 
    } 
} 

Longue histoire courte, je dois créer un PageInfo objet. Comment puis-je en créer un en utilisant Reflection et également définir sa propriété ItemsPerPage?

J'ai essayé:

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

Le problème est que SetValue erreurs sur avec Property set method not found.

+0

Que faites-vous pour créer un 'PageInfo'? Peut-être que si vous posez une nouvelle question sur * "Comment puis-je faire X sans créer mon propre PageInfo?" * Vous pouvez avoir une meilleure solution que d'utiliser la réflexion. –

+0

J'avais peur que quelqu'un puisse demander. Je programme une bibliothèque d'interface abstraite pour consolider deux bibliothèques de messagerie différentes que j'utilise ensemble (ceci et la bibliothèque d'échange) J'essaye de consolider une manière de pager des données entre les deux. Malheureusement, une grande mise en garde avec cette bibliothèque IMAP est que vous ne pouvez pas vraiment construire une requête de pagination arbitraire, mais devez toujours utiliser un objet de pagination lié après avoir fait un appel pour obtenir des données paginées. C'est à cause de la nature de la bibliothèque et de la façon dont son API a été implémentée que cela devient un peu pénible. – Alexandru

Répondre

1

propriétés getter seulement ne sont pas setters. Ils utilisent un champ de support readonly qui peut uniquement être défini dans le constructeur.

Vous pouvez modifier les propriétés pour définir un paramètre privé, par ex.

public int ItemsPerPage { get; private set; } 

Si vous ne disposez pas d'un accès au code, vous pouvez trouver le champ correspondant à l'aide GetField et définir sa valeur.

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

Impossible de modifier la bibliothèque car je n'ai pas la source, donc je ne peux pas éditer la propriété 'ItemsPerPage'. – Alexandru

+0

@Alexandru J'ai mis à jour ma réponse. Essaye le. –

+0

Vérification de la bibliothèque en utilisant * dotPeek *, et aussi en énumérant par le 'DeclaredFields' ... Je suis un peu impassible, parce que ... leurs champs nommés contiennent des noms tels que' # = qOeu6uj6DPtGwJ1qAj8pvJQ == 'et' # # = qQACP_gKR9skNS8JCd3aPRw == ', ce qui m'amène à croire qu'ils les hachent ou quelque chose pour chaque version de la bibliothèque, ce qui est nul parce que la capacité de mise à jour sort par la fenêtre ... – Alexandru