如何将_ComObject类型转换为本机类型,例如Long或其他类型(出现强制转换错误)? [英] How do I convert type _ComObject to a native type like Long or other (getting cast error)?

查看:158
本文介绍了如何将_ComObject类型转换为本机类型,例如Long或其他类型(出现强制转换错误)?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图通过调用

Principal.ExtensionGet("lastLogonTimestamp")

VB.NET代码:

<DirectoryProperty("lastLogonTimestamp")>
Public Property LastLogonTimestamp() As Date? ' no matter what this type is, I cannot cast the Object coming in
    Get
        Dim valueArray = ExtensionGet("lastLogonTimestamp")
        If valueArray Is Nothing OrElse valueArray.Length = 0 Then Return Nothing
        Return DateTime.FromFileTimeUtc(valueArray(0))
    End Get
    Set(value As Date?)
        ExtensionSet("lastLogonTimestamp", value)
    End Set
End Property

这将返回 Object (即 Object())或 null 。麻烦在于它抱怨我对 Long 的转换(或其他我尝试过的类型: ULong 日期字符串)。它总是告诉我这样的情况:

This returns an array of Object (i.e. Object()) or null. The trouble is it complains about my cast to Long (or other types I have tried like: ULong, Date, and String). It always tells me something like this:


从'_ComObject'类型到'Long'类型的转换无效。

Conversion from type '_ComObject' to type 'Long' is not valid.

一个新问题,我着手进行另一种选择(从DateTime到64位)

In a new question, I set out to go the other way (from DateTime to 64 bit)

推荐答案

使用中提供的C#代码链接(通过HansPassant的注释),我使用以下VB代码解决了此问题:

Using C# code provided in link via HansPassant's comment below, I resolved this with the following VB code:

<DirectoryProperty("lastLogonTimestamp")>
Public Property LastLogonTimestamp() As Date?
    Get
        'Dim valueArray = GetProperty("whenChanged")
        Dim valueArray = ExtensionGet("lastLogonTimestamp") 'ExtensionGet("LastLogon")
        If valueArray Is Nothing OrElse valueArray.Length = 0 Then Return Nothing

        Dim lastLogonDate = valueArray(0)
        Dim lastLogonDateType = lastLogonDate.GetType()
        Dim highPart = CType(lastLogonDateType.InvokeMember("HighPart", Reflection.BindingFlags.GetProperty, Nothing, lastLogonDate, Nothing), Int32)
        Dim lowPart = CType(lastLogonDateType.InvokeMember("LowPart", Reflection.BindingFlags.GetProperty Or Reflection.BindingFlags.Public, Nothing, lastLogonDate, Nothing), Int32)
        Dim longDate = CLng(highPart) << 32 Or (CLng(lowPart) And &HFFFFFFFFL)
        Dim result = IIf(longDate > 0, CType(DateTime.FromFileTime(longDate), DateTime?), Nothing)

        Return result
        'Return DateTime.FromFileTimeUtc(valueArray(0))
    End Get
    Set(value As Date?)
        ExtensionSet("lastLogonTimestamp", value)
    End Set
End Property

和C#版本(从):

[DirectoryProperty("RealLastLogon")]
public DateTime? RealLastLogon
{
    get
    {
        if (ExtensionGet("LastLogon").Length > 0)
        {
            var lastLogonDate = ExtensionGet("LastLogon")[0];
            var lastLogonDateType = lastLogonDate.GetType();
            var highPart = (Int32)lastLogonDateType.InvokeMember("HighPart", BindingFlags.GetProperty, null, lastLogonDate, null);
            var lowPart = (Int32)lastLogonDateType.InvokeMember("LowPart", BindingFlags.GetProperty | BindingFlags.Public, null, lastLogonDate, null);

            var longDate = ((Int64)highPart << 32 | (UInt32)lowPart);

            return longDate > 0 ? (DateTime?) DateTime.FromFileTime(longDate) : null;
        }

        return null;
    }
}

这篇关于如何将_ComObject类型转换为本机类型,例如Long或其他类型(出现强制转换错误)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆