我正在尝试创建一个可以接受任何对象的泛型方法,其中甚至对象都是List<AnyClass>
。
类似的东西:
public static void MyMethod(object _anyObject)
{
}
所以在我的方法中它接受参数为Object,然后我将确定要按类型执行的操作
所以,当我知道这是一个List类型时,我想将该对象转换回List<AnyClass>
,将每个对象和它们的属性放在一起
我试着这样做:
List<object> ObjectList = object as List<object>;
但它会返回null
,因为对象原来是List<AnyClass>
提前致谢
=====
编辑:对不起,好像我还没说清楚,因为我简化了问题... 我的意思是对象可能是:
_anyObject = List<Class1>
_anyObject = Class2
_anyObject = DataSet
_anyObject = AnyClass
_anyObject = List<object>
所以说,用户甚至可以输入List<object>
,但该列表中的每个对象都可以是不同的类。这就是我无法使用<T>
的原因。
我的问题的原始是:
public static void MyMethod(List<object> _anyList)
{
}
然后我不在乎他们放入列表中的内容,即使列表中的对象包含另一个对象列表......
答案 0 :(得分:12)
泛型List类实现非通用IList接口,因此您可以说:
IList objectList = obj as IList;
然而,您尝试做的事情通常被认为是不好的做法,因为它消除了任何类型安全的外观。如果你在使用这个的上下文中解释,我们可能会建议一个更好的选择,比如使用泛型方法。
答案 1 :(得分:4)
您可以使用Generics
来使用此
public static void myMethod<T>(T object)
{
T yourObject = object;
if (yourObject is ICollection)
{
//Do your iteration
}
}
答案 2 :(得分:1)
如果您想要一个对不同类型执行操作的泛型方法,请创建一个真正的通用方法:
public static void MyMethod<SomeType>(SomeType _anyObject)
您的问题表明您确实需要一种方法对不同类型执行不同的操作,而不是相同的操作。您可能希望通过使用方法重载来重新考虑这样的设计。
public static void MyMethod(List<AnyClass> list)
public static void MyMethod(int anyInt)
public static void MyMethod(string someString)
等等你想要的类型。
答案 3 :(得分:1)
List<object>
是一种不同于List<int>
。这就是你的演员失败的原因。
根据您的目标,您应该选择其他解决方案。看来你的方法需要能够处理列表和普通对象。
List<T>
确实实现了IEnumerable
,它允许您枚举所有元素。
public static void MyMethod( object _anyObject )
{
IEnumerable list = _anyObject as IEnumerable;
if ( list != null )
{
foreach ( var item in list )
{
// Do whathever you want.
}
}
else
{
// Probably just a plain object, not a collection.
}
}
答案 4 :(得分:0)
所以在我的方法中它接受参数为Object,然后我将确定他们的类型
要做什么
听起来您想要使用is
关键字:
if (_anyObject is List<AnyClass>)
{
List<AnyClass> list = (List<AnyClass>)_anyObject;
}
else if (_anyObject is ...)
{
}
不过更喜欢使用方法重载。
答案 5 :(得分:0)
听起来你应该使用method overloading而不是类型检测。这也会将您的单个大型方法分解为更小,更可维护的方法。
public static void MyMethod(List<AnyClass> list)
{
foreach (var obj in list)
{
MyMethod(obj);
}
}
public static void MyMethod(AnyClass single)
{
//work with single instance
}