如何将Object转换为List<MyClass>?

12

我正在尝试编写一个通用方法,可以接受任何对象,其中甚至包括 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)
{

}

那么,我不在乎他们将什么放入列表中,即使列表中的对象包含另一个对象列表...


你的方法对传递的参数做了什么?我认为这是遗漏的基本信息。 - Steven Jeuris
参数应该是数据集、类对象或包含类对象的列表,用于进行数据映射。 - King
6个回答

17
通用的List类实现了非泛型的IList接口,因此您可以这样说:
IList objectList = obj as IList;

然而,你尝试做的通常被认为是不良实践,因为它消除了任何类型安全的迹象。如果你解释一下你使用这个的上下文,我们或许能够建议更好的替代方案,比如使用一个泛型方法。


我想要做的是接受任何类对象、数据集、List<anyClass>,迭代它们的属性并将它们的数据取出进行映射。 - King
1
@King: 如果调用方法知道它有哪种对象类型,应该使用运算符重载来为数据集(Dataset)、列表(List)等制作不同的方法。这样,您的编译代码会自动调用正确版本的方法,而不必使用反射来确定使用的类型。然而,如果所有调用代码知道的只是它有一个“对象”,我想这是你能做的最好的事情了。 - StriplingWarrior

4
您可以使用“泛型”来利用这个。
public static void myMethod<T>(T object)
{
   T yourObject = object;
   if (yourObject is ICollection)
   {
     //Do your iteration
   }

}

如果 T 最终变成了 List<AnyClass>,我不明白你的解决方案如何帮助 OP 遍历列表。 - Kirk Woll
@KirkWoll 因为它创建了一个对象作为 List<AnyClass>,如果我没记错的话,这个对象应该从某个地方继承 ICollection - msarchet
1
但这与非泛型方法没有什么不同。你的方法体并没有利用类型参数。那么这有什么意义呢? - Kirk Woll
因为他之后可以推断关于对象的事情,而无需始终检查它的类型。 - msarchet
请提供一个这样的推断的例子。 - Kirk Woll

2

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.
    }
}

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)

对于你想要的类型,以此类推。


1

看起来你应该使用方法重载而不是类型检测。这样也会将你的单个大方法分解成更小、更易于维护的方法。

public static void MyMethod(List<AnyClass> list)
{
    foreach (var obj in list)
    {
        MyMethod(obj);
    }
}

public static void MyMethod(AnyClass single)
{
    //work with single instance    
}

0
所以在我的方法中,它接受对象作为参数,然后我会根据它们的类型来确定要执行什么操作。
听起来你想使用is关键字:
if (_anyObject is List<AnyClass>)
{
    List<AnyClass> list = (List<AnyClass>)_anyObject;
}
else if (_anyObject is ...)
{
}

不过最好使用方法重载。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接