允许将字符串强制转换为我的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;
}
}
根据我能够确定的,这应该允许我执行以下操作,其中user
是object
类型的变量:
List<SystemUser> systemUsers = new List<SystemUser>();
systemUsers.Add((SystemUser)user); // causes exception
然而,如果user
是一个字符串,我总是得到InvalidCastException: "无法转换类型'System的对象。字符串'类型'SystemUser'"
我在这里错过了什么?
听起来你的user
变量的类型是object
。您只对以下场景提供了转换支持:
-
string
⇒SystemUser
-
SystemUser
⇒string
虽然您的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
并将其反序列化(解析)回您的类的实例,或者…如果它不是一个字符串,它必须是你的类型的一个实例:显式向下转换它