我有一个名为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.String'类型的对象强制转换为'SystemUser'”
我在这里缺少什么?
答案 0 :(得分:2)
听起来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()`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。