处理不支持的类型

时间:2012-05-16 16:25:38

标签: c# exception-handling

我正在创建一个数据数组:

var data = new Data[] { 1, "string", true, //.. }; //In this case, assume that strings and booleans are supported types, but integers are not.

当我存储数据集时,它会运行一系列if语句来存储数据:

if (data is string) StoreData(data as string);
else if (data is boolean) StoreData(data as boolean);
//..

因为不支持整数,所以我希望我的代码能够适当地处理它(无论是记录等等)。但是,我仍然希望能够存储第二种,第三种等支持的类型。

更新:我希望代码在找到不受支持的类型后继续运行,因为可能存在后续支持的类型存储。

如何处理不受支持的类型,然后存储后续支持的类型?

1 个答案:

答案 0 :(得分:3)

我会使用隐式运算符将支持的类型转换为您的Data类。为支持的任何数据类型添加隐式运算符,不支持的数据类型将无法编译。

http://www.codeproject.com/Articles/15191/Understanding-Implicit-Operator-Overloading-in-C

public class Data
{
    private object UnderlyingValue;

    private Data(object underlyingValue)
    {
        this.UnderlyingValue = underlyingValue;
    }

    public static implicit operator Data(string value)
    {
        return new Data(value);
    }

    public static implicit operator Data(bool value)
    {
        return new Data(value);
    }
}

var data = new Data[] { 1, "string", true }; //compiler error on "1" because no supporting conversion method is provided

正如乔恩所说,你的要求有点含糊,所以我不知道还有什么可以补充。根据您的需要,您可以使用通用版本的数据,或者之后管理Data对象的方式可能会有所不同。您还可以运行某个工厂来检查支持的类型并抛出格式良好的异常。

编辑:根据你的编辑,你可以这样做:

public class SupportedObjectsResults
{
    public List<object> SupportedObjects { get; private set; }
    public List<object> UnsupportedObjects { get; private set; }

    public SupportedObjectsResults(List<object> supportedObjects, List<object> unsupportedObjects)
    {
        this.SupportedObjects = supportedObjects;
        this.UnsupportedObjects = unsupportedObjects;
    }
}

public static class SupportedTypeHelper
{
    public static SupportedObjectsResults GetSupportedTypes(params object[] values)
    {
        List<object> supportedObjects = new List<object>();
        List<object> unsupportedObjects = new List<object>();

        foreach(object value in values)
        {
            if (CheckIsSupported(value))
                supportedObjects.Add(value);
            else
                unsupportedObjects.Add(value);
        }

        return new SupportedObjectsResults(supportedObjects, unsupportedObjects);
    }

    private static bool CheckIsSupported(object underlyingValue)
    {
        return (underlyingValue is string ||
                underlyingValue is bool
                );
    }
}

然后你可以找出哪些对象是支持的,哪些不是:

var supportedResults = SupportedTypeHelper.GetSupportedTypes(1, "string", true);
//supportedResults.SupportedObjects = ["string", true]
//supportedREsults.UnsupportedObjects = [1];

顺便说一句,我不太喜欢第二种解决方案;大量的拳击和编译时没有检查。无论如何,我想这应该可以帮助您解决特定的设计问题。