【问题标题】:vb.NET to C# conversion error: Cannot implicitly convert type 'object' to 'MyCustomObject' An explicit conversion existsvb.NET 到 C# 的转换错误:无法将类型 'object' 隐式转换为 'MyCustomObject' 存在显式转换
【发布时间】:2012-03-23 02:09:21
【问题描述】:

我正在尝试将我在网上找到的一些 VB.net 代码转换为一些 C# 代码,但是在我的 C# 代码中的这行代码周围出现以下错误:


DNNServiceSecurityToken token = DataCache.GetCache("DNNServiceSecurityToken_" + TokenId.ToString());

具体错误代码为:

不能隐式转换类型'object' 到“MyTypes.DNNServiceSecurityToken”。 存在显式转换 (你错过了演员吗?)



    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.ServiceModel.Dispatcher;
    using DotNetNuke.Common.Utilities;
    using DotNetNuke.Entities.Users;
    using MyTypes;

        public class SecurityTokenInspector : IParameterInspector
        {
            public string Roles;

            public SecurityTokenInspector(string value)
            {
                Roles = value;
            }

            public object BeforeCall(string operationName, object[] inputs)
            {

                // token will always be the last parameter 
                int index = inputs.Length - 1;
                string TokenId = inputs[index].ToString();

                // ********** ERROR LINE BELOW HERE *********** //
                // THE ERROR IS HAPPENING WITH THIS LINE:       //
                // ******  first make sure token exists  ****** //
                DNNServiceSecurityToken token = DataCache.GetCache("DNNServiceSecurityToken_" + TokenId.ToString());
                if (token == null)
                {
                    throw new Exception("Security Token Expired. Please request a new Token");
                }

                // if token exists, check user roles 
                UserInfo user = UserController.GetUserById(0, token.UserID);
                if (!(user.IsInRole(Roles)))
                {
                    throw new Exception("Access Denied. Role Membership Requirements not met");
                    return null;
                }

                return null;

            }

            public void AfterCall(string operationName, object[] outputs, object returnValue, object correlationState)
            {
                return;
            }

        }

<pre></pre>

Imports System 
 Imports System.ServiceModel.Dispatcher 
 Imports DotNetNuke.Common.Utilities 
 Imports DotNetNuke.Entities.Users 

 Public Class SecurityTokenInspector 
    Implements IParameterInspector 

    Public Roles As String 

    Public Sub New(ByVal value As String) 
       Roles = value 
    End Sub 

    Public Function BeforeCall(ByVal operationName As String, _ 
       ByVal inputs() As Object) As Object _ 
       Implements IParameterInspector.BeforeCall 

       ' token will always be the last parameter 
       Dim index As Integer = inputs.Length - 1 
       Dim TokenId As String = inputs(index).ToString() 

       ' first make sure token exists 
       Dim token As DNNServiceSecurityToken = 
          _DataCache.GetCache("DNNSecurityToken_" & TokenId) 
       If token Is Nothing Then 
          Throw New Exception( _ 
          "Security Token Expired. Please request a new Token") 
       End If 

       ' if token exists, check user roles 
       Dim user As UserInfo = UserController.GetUserById(0, token.UserID) 
       If Not user.IsInRole(Roles) Then 
          Throw New Exception( _ 
          "Access Denied. Role Membership Requirements not met") 
          Return Nothing 
       End If 

        Return Nothing 

    End Function 

    Public Sub AfterCall(ByVal operationName As String, _ 
       ByVal outputs() As Object, ByVal returnValue As Object, _ 
       ByVal correlationState As Object) _ 
       Implements IParameterInspector.AfterCall 
       Return 
    End Sub 

 End Class 

【问题讨论】:

  • 我建议您阅读一本好的 C# 书籍或教程。这是基本的铸造。
  • 你说得对,我上个月才学习 C#,但感谢您的明显建议。

标签: c# vb.net implicit-conversion


【解决方案1】:

您需要将返回对象转换为变量的对象类型:

DNNServiceSecurityToken token = (DNNServiceSecurityToken) DataCache.GetCache("DNNServiceSecurityToken_" + TokenId.ToString());

【讨论】:

  • 如果他这样做,那么如果类型不匹配并且用户不希望这样,因为他在该行之后显式检查 null ,则不会引发异常。在这种情况下,更好的解决方案是使用 as 运算符?
【解决方案2】:

尝试按照错误提示进行转换:

DNNServiceSecurityToken token = DataCache.GetCache("DNNServiceSecurityToken_" + TokenId.ToString()) as DNNServiceSecurityToken;

【讨论】:

  • @user1287306 真的,好的,假设这会起作用,因为您随后会检查 null,这是使用 as 时的常见模式。
  • 也许 DNNServiceSecurityToken 是一个值类型?
  • @Murven 嗯好的。如果我们假设返回的类型始终是 DNNServiceSecurityToken,那么之后对 null 的检查肯定是无关紧要的。
【解决方案3】:

您真的需要将令牌作为 DNNServiceSecurityToken 吗?还是 GetCache 返回的类型也能正常工作?

试试这个:

var token = DataCache.GetCache("DNNServiceSecurityToken_" + TokenId.ToString());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-18
    相关资源
    最近更新 更多