3

问题很简单:有什么方法可以从s 中获取有问题System.Type的 sInvalidCastException吗?我希望能够以诸如“预期 {to-type}; found {from-type}”之类的格式显示有关失败的类型转换的信息,但我找不到访问所涉及类型的方法。

编辑:我需要能够访问所涉及的类型的原因是因为我有一些关于较短名称的信息。例如RFSmallInt,我想说类型实际上是,而不是 type smallint。而不是错误消息

Unable to cast object of type 'ReFactor.RFSmallInt' to type 'ReFactor.RFBigInt'.

我实际上想显示

Expected bigint; recieved smallint.
4

3 回答 3

7

一种解决方案可能是实现一个 Cast 函数,如果转换不成功,它会为您提供该信息:

static void Main(string[] args)
{
    try
    {
        string a = Cast<string>(1);
    }
    catch (InvalidCastExceptionEx ex)
    {
        Console.WriteLine("Failed to convert from {0} to {1}.", ex.FromType, ex.ToType);
    }
}



public class InvalidCastExceptionEx : InvalidCastException
{
    public Type FromType { get; private set; }
    public Type ToType { get; private set; }

    public InvalidCastExceptionEx(Type fromType, Type toType)
    {
        FromType = fromType;
        ToType = toType;
    }
}

static ToType Cast<ToType>(object value)
{
    try
    {
        return (ToType)value;
    }
    catch (InvalidCastException)
    {
        throw new InvalidCastExceptionEx(value.GetType(), typeof(ToType));
    }
}
于 2013-08-12T19:46:38.580 回答
2

我用自定义异常做了这种事情:

public class TypeNotImplementedException : Exception {

    public Type ToType { get { return _ToType; } }
    private readonly Type _ToType;

    public Type FromType { get { return _FromType; } }
    private readonly Type _FromType;

    public override System.Collections.IDictionary Data {
        get {
            var data = base.Data ?? new Hashtable();
            data["ToType"] = ToType;
            data["FromType"] = FromType;
            return data;
        }
    }

    public TypeNotImplementedException(Type toType, Type fromType, Exception innerException) 
        : base("Put whatever message you want here.", innerException) {
        _ToType = toType;
        _FromType = fromType;
    }

}

class Program {

    private static T Cast<T>(object obj) {
        try {
            return (T)obj;
        }
        catch (InvalidCastException ex) {
            throw new TypeNotImplementedException(typeof(T), obj.GetType(), ex);
        }
    }

    static void Main(string[] args) {

        try {
            Cast<string>("hello world" as object);
            Cast<string>(new object());
        }
        catch (TypeNotImplementedException ex) {
            Console.WriteLine(ex);
        }
    }
}
于 2013-08-12T19:52:21.297 回答
1

消息本身以合理显示的格式为您提供。例如:

Unable to cast object of type 'System.String' to type 'System.Xml.Linq.XElement'.

我不相信有一种编程方式可以访问所涉及的类型(不,我不建议解析消息)。

特别是Data,不幸的是,该物业没有随附的信息。

所以基本上,你的选择是:

  • 以当前形式使用消息
  • 更改您的设计以避免需要此
  • 走下解析异常文本的可怕路线(不推荐,特别是如果您无法轻松控制所使用的文化)
于 2013-08-12T19:34:41.313 回答