Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用反射设置此对象';谁的财产?_C#_.net_Dll_Reflection_Aspose - Fatal编程技术网

C# 如何使用反射设置此对象';谁的财产?

C# 如何使用反射设置此对象';谁的财产?,c#,.net,dll,reflection,aspose,C#,.net,Dll,Reflection,Aspose,我有一个正在使用的外部库,即Aspose.Email.dll(可在NuGet上获得)。它有一个PageInfo类。转到定义在Visual Studio中为其显示以下内容: 长话短说,我需要创建一个PageInfo对象。如何使用反射创建一个并设置其ItemsPerPage属性 我试过这个: var result = (PageInfo)FormatterServices.GetUninitializedObject(typeof(PageInfo)); typeof(PageInfo).GetPr

我有一个正在使用的外部库,即Aspose.Email.dll(可在NuGet上获得)。它有一个
PageInfo
类。转到定义在Visual Studio中为其显示以下内容:

长话短说,我需要创建一个PageInfo对象。如何使用反射创建一个并设置其
ItemsPerPage
属性

我试过这个:

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

问题是
SetValue
错误,未找到
属性集方法。

仅Getter属性没有setter。它们使用只能在构造函数中设置的
只读
支持字段

您可以将属性更改为具有私有setter,例如

public int ItemsPerPage { get; private set; }
如果您无权访问代码,可以使用
GetField
查找匹配字段并设置其值

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

无法更改库,因为我没有源代码,因此无法编辑
ItemsPerPage
属性。请使用dotPeek检查库,并通过
DeclaredFields
枚举…我有点进退两难,因为…它们的命名字段包含诸如
#=qOeu6uj6DPtGwJ1qAj8pvJQ==
#=qQACP\u gKR9skNS8JCd3aPRw===
,这让我相信它们正在对每个版本的库进行哈希运算,这很糟糕,因为升级功能已经过时了…它们使用的是模糊处理程序。只需从getter中获取字段名并使用它。注意,它在库的其他版本中可能会更改。当您说从getter中获取字段名并使用它时,您的意思是什么?哦,你的意思是只需使用命名字段,如
#=qOeu6uj6DPtGwJ1qAj8pvJQ==
?查看ItemsPerPage的getter代码中出现的字段,取其名称并在GetField中使用它创建
页面信息
,你在做什么?也许如果你问一个新问题“我怎样才能在没有包装我自己的页面信息的情况下做X?”你可能有一个比使用反射更好的解决方案。我担心有人会问。我正在编写一个抽象接口库来合并两个不同的邮件库(这两个库和Exchange库),我正在尝试合并这两个库之间的分页数据。不幸的是,这个IMAP库的一个大警告是,您不能真正构建任意分页查询,但必须在第一次调用以获取分页数据后始终使用链接的分页对象。这是因为库的性质以及它的API是如何实现的,所以有点麻烦。
typeof(PageInfo).GetTypeInfo().DeclaredFields
    .First(f => f.Name.Contains("ItemsPerPage")).SetValue(result, 1);