允许将字符串强制转换为我的Class

本文关键字:转换 我的 Class 字符串 | 更新日期: 2023-09-27 18:10:03

我有一个名为SystemUser的类,定义如下:

    public class SystemUser
    {
        public int userID;
        public string userName;
        public string email;
        public SystemUser(int userId, string userName, string email)
        {
            this.userID = userId;
            this.userName = userName;
            this.email = email;
        }
        public static explicit operator System.String(SystemUser su)
        {
            return su.userName;
        }
        public static implicit operator SystemUser(System.String s)
        {
            SystemUser thing = new SystemUser(-1, s);
            return thing;
        }
    }

根据我能够确定的,这应该允许我执行以下操作,其中userobject类型的变量:

List<SystemUser> systemUsers = new List<SystemUser>();
systemUsers.Add((SystemUser)user); // causes exception

然而,如果user是一个字符串,我总是得到InvalidCastException: "无法转换类型'System的对象。字符串'类型'SystemUser'"

我在这里错过了什么?

允许将字符串强制转换为我的Class

听起来你的user变量的类型是object。您只对以下场景提供了转换支持:

  • stringSystemUser
  • SystemUserstring

虽然您的user变量可能包含对string实例的引用,但它不能隐式向下强制转换为string

string(或任何其他类型)可以隐式上转换为object(因为string is object的求值为true),反之则不可能。object实例不能隐式向下转换为string,因为object is string的求值为false

您可以:

  • 显式地将object转换为string,然后再转换为SystemUser,或者

    object     user     = GetStringRepresentingUser() ;
    SystemUser instance = (SystemUser)(string)user ;
    
  • user的数据类型更改为string

    string     user     = GetStringRepresentingUser() ;
    SystemUser instance = (SystemUser)user ;
    

编辑到注释:

在这里添加重载可能会有所帮助。你可以这样做:

public static SystemUser GetSystemUser( object o )
{
  SystemUser instance ;
  if ( o is string )
  {
    instance = GetSystemUser( (string) o ) ;
  }
  else
  {
    instance = (SystemUser) o ;
  }
  return instance ;
}
public static SystemUser GetSystemUser( string s )
{
  return (SystemUser) s ;
}

您还可以考虑使用Parse() ' TryParse() '习惯用法:

public static SystemUser Parse( string s )
{
  // parse the string and construct a SystemUser instance
  // throw a suitable exception if the parse is unsuccessful
}
public static bool TryParse( string s , out SystemUser instance )
{
  // as above, except no exception is thrown on error.
  // instead, return true or false, setting instance to default(SystemUser) (null)
  // if the conversion wasnt' possible.
}

使用Parse()/TryParse()也可能更容易理解。

不管你怎么做,在某些时候你必须看看你的object并检查它的类型:

  • 如果它实际上是一个字符串,显式向下转换为string并将其反序列化(解析)回您的类的实例,或者…

  • 如果它不是一个字符串,它必须是你的类型的一个实例:显式向下转换它