如何使用反射来设置此对象的属性?

时间:2016-07-14 15:37:45

标签: c# .net dll reflection aspose

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

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

问题是SetValue

出现Property set method not found.错误

1 个答案:

答案 0 :(得分:1)

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

您可以将属性更改为具有私有设置器,例如

public int ItemsPerPage { get; private set; }

如果您无权访问该代码,可以使用GetField找到匹配字段并设置其值。

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