在 .NET 对象上设置 Enum 属性

2024-03-08

从这个问题继续:在 .NET 对象上设置“可为空”属性 https://stackoverflow.com/questions/61334031/setting-a-nullable-property-on-a-net-object

感谢奥利维尔迄今为止的帮助。我现在将这个导入用于 .NET 类型库:https://github.com/DelphiWorlds/MiscStuff/blob/master/Test/mscorlib_TLB.pas https://github.com/DelphiWorlds/MiscStuff/blob/master/Test/mscorlib_TLB.pas它基于 CLR v4,而不是我使用的过时版本。

..我现在有这个代码:

procedure TDotNetObject.SetEnumProperty(const APropertyName: string; const AValue: OleVariant; const ATypeName: string; const AIndex: Integer = -1);
var
  LRes: HRESULT;
  LEnumType, LPropertyType: _Type;
  LInvokeFlags: TOleEnum;
  LArgs: PSafeArray;
  LConvertedValue: OleVariant;
  LPropertyInfo: _PropertyInfo;
  LIndex: PSafeArray;
  LName: WideString;
  LResHex: string;
begin
  LPropertyType := nil;
  LRes := FType.GetProperty(APropertyName, BindingFlags_Instance or BindingFlags_Public or BindingFlags_NonPublic, LPropertyInfo);
  if Succeeded(LRes) then
  begin
    if ATypeName.IsEmpty then
      LPropertyInfo.GetType(LPropertyType)
    else
      LPropertyType := MTDataClr.GetType(ATypeName); // This is a workaround since for obtaining the underlying type
  end;
  if LPropertyType <> nil then
  begin
    // Convert the value to the correct type
    LEnumType := MTDataClr.GetCoreType('System.Enum');
    LInvokeFlags := BindingFlags_InvokeMethod or BindingFlags_Public or BindingFlags_Static;
    LArgs := VariantToPSafeArray(VarArrayOf([LPropertyType, AValue]));
    if Succeeded(LEnumType.InvokeMember_2('ToObject', LInvokeFlags, nil, Null, LArgs, nil, LConvertedValue)) then
    begin
      // ***** Despite the InvokeMember_2 call having "succeeded", LConvertedValue is exactly the same as AValue ****
      if AIndex >= 0 then
        LIndex := VariantToPSafeArray(VarArrayOf([AIndex]))
      else
        LIndex := nil;
      LRes := LPropertyInfo.SetValue(FTarget, LConvertedValue, LIndex);
      if not Succeeded(LRes) then
      begin
        LResHex := IntToHex(LRes);
        Sleep(0);
      end;
    end;
  end;
end;

一切正常,直到 SetValue。 LResHex 是“80070057”,显然等于 ERROR_INVALID_PARAMETER。

有什么线索可以说明我哪里出错了吗?

编辑:根据我添加到代码中的注释,尽管 InvokeMember_2 调用具有“成功”,但 LConvertedValue 是exactly与AValue相同。这可以解释为什么其余部分不起作用。关于如何使 ToObject 调用实际返回“对象”的任何线索?


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 .NET 对象上设置 Enum 属性 的相关文章

随机推荐

  • TFS 与 JIRA/Bamboo/SVN [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在 us-central1 以外的网络区域使用 httpsCallable

    我部署了一个云函数 如下所示 export const publishVersion functions region europe west2 https onCall async data context gt 然后在我的网络客户端中
  • Golang - ToUpper() 在单个字节上?

    我有一个 byte b 我想选择一个字节 b pos 并将其更改为大写 然后小写 bytestype 有一个方法叫做ToUpper 我如何将其用于单个字节 Calling ToUpper在单字节上 OneOfOne 给出了最有效的 调用数千
  • 柯里化有什么好处?

    我认为我不太理解柯里化 因为我看不到它可以提供任何巨大的好处 也许有人可以用一个例子来启发我 证明它为什么如此有用 它真的有好处和应用吗 还是只是一个被过度重视的概念 两者之间有细微差别currying and 部分应用 尽管它们密切相关
  • BigQuery 分区表在 _PARTITIONTIME 上联接

    有两个分区表 都带有伪列 PARTITIONTIME 我想在 PARTITIONTIME 上加入它们 然后我想使用 PARTITIONTIME 过滤器查询结果表 但我注意到该过滤器仅传播到 JOIN 语句的第一个表 下面是一个例子 WITH
  • 如何在 Sublime Text 2 中解析来自 TypeScript 的错误消息?

    我正在尝试为 TypeScript 设置 Sublime Text 2 构建系统 我已按照我找到的指示进行操作here https stackoverflow com questions 12779631 how to configure
  • 问题 如何使 C# 的 VS IDE 设计器失效/刷新?

    I have 定制表格继承自Form它实现了一个名为的布尔属性Prop 我将使用的表单将继承自定制表格 此属性将对表单进行一些绘制和更改 如果已启用 但是 这并没有按预期工作 设计的 VS IDE 没有刷新以显示更改 但是 如果我按 Ctr
  • 使用 boost::asio::ip::tcp::iostream 的低带宽性能

    我写了一个小测试程序 使用boost asio ip tcp iostream传输约 38 MiB 的数据 include
  • C++ 标准是否强制要求对 wchar_t 进行编码?

    以下是我的 2014 年标准草案 N4140 副本的一些摘录 22 5 标准代码转换方面 locale stdcvt 3 对于三个代码转换方面中的每一个codecvt utf8 codecvt utf16 and codecvt utf8
  • NestedScrollView 下方的 TextView 高度为 wrap_content 不可见

    下面是底页的布局文件 我有一个TextView在嵌套滚动视图下方 当内容较大时 TextView以下NestedScrollView不可见 如果 NestedScrollView 的内容很小 它是可见的 我不明白是什么原因造成的 这是我的布
  • 套接字编程中的客户端到客户端消息传递

    我正在开发一个项目 该项目是基于 C 中的 WinSock 的服务器客户端应用程序 我已经完成了服务器和客户端之间通信所需的任何操作 我能够在它们之间发送和接收消息 现在我需要知道如何完成客户端到客户端消息传递部分以及必须如何完成工作 我只
  • 如何获取图片资源名称

    如何获取动态设置的imageview资源名称 这是图像适配器代码 public class ImageAdapter extends BaseAdapter private Context mContext public ImageAdap
  • 当构造函数采用字符串数组作为参数时,使用反射创建对象实例

    我正在尝试创建一个仅具有以下构造函数的类的实例 覆盖默认构造函数 public HelloWorld String args 我正在做以下事情 Class reflect HelloWorld obj null some logic to
  • Nodejs 错误: module.js:340 抛出错误;

    我尝试运行示例服务器 但在 Windows 上收到错误消息 然后我尝试在我朋友的机器上运行它 但运行得很顺利 windows系统也是如此 我不知道发生了什么事 让我展示一下源代码和错误消息 源代码 var http require http
  • 在 catch 上下文之外重新抛出异常时如何保留堆栈跟踪?

    TL DR 稍后如何引发先前捕获的异常 同时保留原始异常的堆栈跟踪 因为我认为这对Resultmonad 或计算表达式 尤其是 由于该模式通常用于包装异常而不抛出异常 因此下面是一个已解决的示例 type Result lt TResult
  • Yii2 REST 查询

    嘿 我有一个 ProductController 它扩展了 yii rest ActiveController 问题是我如何通过 HTTP GET 请求进行查询 Like http api test loc v1 products sear
  • android ndk:-fPIC 和 -pie 是互斥的吗?

    我正在使用 Android r10e NDK 为 Android 构建 Unison 文件同步可执行文件 但这并不是真正的 Android 问题 Android gt 5 0 SDK 21 要求可执行文件与位置无关 所以我 编译时将 pie
  • 删除 php 扩展名,停止访问带有 .php 扩展名的 url 并删除尾部斜杠

    我希望我的网址没有扩展名 因此没有 php 扩展名 我也希望没有机会访问带有尾部斜杠的网址 如果您尝试使用 php 访问它 以下内容将删除 php 扩展 然后重定向到无扩展的 url 我开始编写一条规则来阻止您使用 和重定向进行访问 但它不
  • 如何使用 Windows Phone 7 应用程序项目中的文件填充列表框

    我想在我的 wp7 应用程序中使用一个列表框 在其中显示特定目录中存在的所有文件的名称 我已添加包含项目本身中所有文件的文件夹 我想填充该文件夹中的所有文件名 我怎样才能访问它 我用它来绑定列表 string files Directory
  • 在 .NET 对象上设置 Enum 属性

    从这个问题继续 在 NET 对象上设置 可为空 属性 https stackoverflow com questions 61334031 setting a nullable property on a net object 感谢奥利维尔