我会使用隐式运算符将支持的类型转换为您的 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,或者您以后想要如何管理 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];
顺便说一句,我不太喜欢第二种解决方案。大量的装箱并且在编译时没有检查。无论如何,我想这应该为您解决特定设计问题提供了一个良好的开端。