如何将Object转换为List <myclass>?</myclass>

时间:2011-03-09 20:44:24

标签: c#

我正在尝试创建一个可以接受任何对象的泛型方法,其中甚至对象都是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)
{

}

然后我不在乎他们放入列表中的内容,即使列表中的对象包含另一个对象列表......

6 个答案:

答案 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    
}