允许将字符串转换为我的类

时间:2014-06-24 16:49:21

标签: c# casting

我有一个名为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.String'类型的对象强制转换为'SystemUser'”

我在这里缺少什么?

1 个答案:

答案 0 :(得分:2)

听起来user变量的类型为object。您仅为以下方案提供了转换支持:

  • stringSystemUser
  • SystemUserstring

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

string(或任何其他类型,可以)隐式上传到object(因为string is object评估为true),反过来是不可能的。由于object评估为stringobject 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()`idiom:

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并将其反序列化(解析)回到您的类的实例中,或者......

  • 如果它不是字符串,则必须是您的类型的实例:excplicity downcast it。