C# 将对象强制转换为泛型列表

C# 将对象强制转换为泛型列表,c#,.net,C#,.net,我有一个要求,我可以在一个对象中获得以下内容- a type T or List<T> 类型T或列表 将对象转换为T很容易。如何将其转换为列表(通过首先检查是否可以成功转换),我想要转换的原因是滚动列表并在每个元素上调用tostring 我的实际代码- namespace Generic_Collection_Code { class Program { public static string DumpObj(object obj)

我有一个要求,我可以在一个对象中获得以下内容-

a type T or List<T> 
类型T或列表
将对象转换为T很容易。如何将其转换为列表(通过首先检查是否可以成功转换),我想要转换的原因是滚动列表并在每个元素上调用tostring

我的实际代码-

namespace Generic_Collection_Code
{
    class Program
    {
        public static string DumpObj(object obj)
        {
            string sTemp = String.Empty;

            List<int> ints = obj as List<int>;
            if (ints != null)
            {
                foreach (int i in ints)
                    sTemp += i.ToString() + ",";
                sTemp.Trim(',');
            }
            else 
            {
                List<string> strings = obj as List<string>;
                if (strings != null)
                {
                    foreach (string s in strings)
                        sTemp += s + ",";
                    sTemp.Trim(',');
                }
                else
                {
                    sTemp += obj.ToString();
                }
            }
            return sTemp;
        }
        static void Main(string[] args)
        {
            List<int> listInts = new List<int>();
            listInts.Add(1);
            listInts.Add(2);
            listInts.Add(3);

            Console.WriteLine("Object1: {0}", DumpObj(listInts));
            int i = 90;

            Console.WriteLine("Object2 {0}", DumpObj(i));


            List<string> listStrings = new List<string>();
            listStrings.Add("1");
            listStrings.Add("2");
            listStrings.Add("3");

            Console.WriteLine("Object3: {0}", DumpObj(listStrings));
            Console.ReadKey();
        }
    }
}
命名空间通用集合\u代码
{
班级计划
{
公共静态字符串DumpObj(对象obj)
{
string sTemp=string.Empty;
List ints=obj as List;
如果(整数!=null)
{
foreach(整数中的整数i)
sTemp+=i.ToString()+“,”;
茎修剪(',');
}
其他的
{
列表字符串=对象作为列表;
if(字符串!=null)
{
foreach(字符串中的字符串s)
sTemp+=s+“,”;
茎修剪(',');
}
其他的
{
sTemp+=obj.ToString();
}
}
返回sTemp;
}
静态void Main(字符串[]参数)
{
List listInts=新列表();
增加(1);
增加(2);
增加(3);
WriteLine(“Object1:{0}”,DumpObj(listInts));
int i=90;
Console.WriteLine(“Object2{0}”,DumpObj(i));
List listStrings=新列表();
列表字符串。添加(“1”);
添加(“2”);
添加(“3”);
WriteLine(“Object3:{0}”,DumpObj(listStrings));
Console.ReadKey();
}
}
}
上面的代码可以工作,但我知道这是一个丑陋的方式来实现这一点。我想从社区问我怎么能有这样的功能-

    public static string DumpObj<T>(object obj)
    {
        string sTemp = String.Empty;

        List<T> list = obj as List<T>;
        if (list != null)
        {
            foreach (T i in list)
                sTemp += i.ToString() + ",";
            sTemp.Trim(',');
        }
        return sTemp;
    }
公共静态字符串DumpObj(objectobj)
{
string sTemp=string.Empty;
List List=obj as List;
如果(列表!=null)
{
foreach(列表中的ti)
sTemp+=i.ToString()+“,”;
茎修剪(',');
}
返回sTemp;
}
这给了我编译错误,因为我在调用DumpObj时必须指定T,错误为-

错误1无法从用法推断方法“Generic_Collection_Code.Program.DumpObj(object)”的类型参数。尝试显式指定类型参数。D:\DotNet\Generic\u Collection\u Code\Generic\u Collection\u Code\Program.cs 57 47 Generic\u Collection\u Code

正如您所看到的,obj是一个对象,我在调用dumobj时不知道它的类型

我希望在这一点上我已经讲清楚了

谢谢你的时间

问候 阿米特说

List<T> genericList = object as List<T>;

if(genericList != null)
{
   // Do the loop
}
List genericslist=对象作为列表;
if(genericList!=null)
{
//循环
}

“as”关键字验证“object”实际上是一个列表。如果是这样,您将从中得到一个列表。如果不是,则返回null。

您得到的编译错误是什么?如果T在上下文中声明为泛型类型参数,那么我在该语句中看到的唯一编译时问题就是使用关键字
object
作为变量名。无论如何,我建议这样做是表达你意图的最好方式:

IEnumerable enumerable = obj as IEnumerable;

if (enumerable != null)
{
    foreach (object item in enumerable)
    {
        sTemp += item.ToString();
    }
}

你也可以考虑使用A,如果你的列表可能有很多条目。

你不能这样做< /P>

List<T> genericList = (List<T>)object
List genericslist=(List)对象
也许是你想要的

List<T> genericList = (List<T>)obj
List genericslist=(List)obj
其中obj是object

将“as”与“is”组合如何

if(对象是列表)
{ 
List genericlist=对象作为列表;
//循环列表
}
else if(对象为T)
{
//做点别的
}

将对象强制转换为System.Collections.IList(而不是通用版本)如何,因为通用列表也实现此接口。然后将它们转换为所需的类型。 这是我正在做的

private static void DataSourcePropertyChanged(DependencyObject sender,     
        DependencyPropertyChangedEventArgs args) {
        BarChart _ = sender as BarChart;

        if (args.Property.Equals(BarChart.DataSourceProperty)) {
            System.Collections.IList data = (System.Collections.IList)args.NewValue;
            if (data == null) return;

            foreach (object __ in data) {
                IChartDataItem item = __ as IChartDataItem;
                BarChartItem bar = new BarChartItem() {
                    Label = item.Label,
                    Value = item.Value
                };
                _._visualCollection.Add(bar);

                if (_.MaxData < item.Value)
                    _.MaxData = item.Value;
            }

            if (_.Orientation == Orientation.Horizontal)
                _.Ratio = _.Width / _.MaxData;
        }
    }
私有静态无效数据源PropertyChanged(DependencyObject发送方,
DependencyPropertyChangedEventArgs(参数){
条形图u=发送方为条形图;
if(args.Property.Equals(BarChart.DataSourceProperty)){
System.Collections.IList data=(System.Collections.IList)args.NewValue;
if(data==null)返回;
foreach(数据中的对象){
IChartDataItem=作为IChartDataItem;
BarChartItem bar=新的BarChartItem(){
标签=项目。标签,
值=项。值
};
_._视觉采集。添加(条);
if(u0.MaxData
Rex M,您的编辑应该是答案。从目前的情况来看,这使得这个问题变得毫无意义,因为一个列表换一个列表可能解决了提问者面临的主要问题。我同意编辑实质性地改变了这个问题。我的理解是,他有一个“object”类型的变量,他不知道它是什么类型。但是如果它是一个列表,那么他想循环它。我认为我们需要看到更多的代码。。。我们中的一些人对这个问题有不同的解释,似乎这个问题是以一种改变它的方式编辑的。你能扩大你的代码样本的范围以包含你正在其中工作的类和方法的签名吗?Amit,请看我的答案。因为ToString是在System.Object上定义的,所以您可以尝试将
obj
用作IEnumerable。是的,这绝对正确。如果你不能有“类”约束,那么你可以说:If(typeof(List).IsAssignableFrom(object.GetType())。我很困惑,为什么不应该是一个类来制作列表呢?我们不是在制作列表。我们有一个目标,一个
private static void DataSourcePropertyChanged(DependencyObject sender,     
        DependencyPropertyChangedEventArgs args) {
        BarChart _ = sender as BarChart;

        if (args.Property.Equals(BarChart.DataSourceProperty)) {
            System.Collections.IList data = (System.Collections.IList)args.NewValue;
            if (data == null) return;

            foreach (object __ in data) {
                IChartDataItem item = __ as IChartDataItem;
                BarChartItem bar = new BarChartItem() {
                    Label = item.Label,
                    Value = item.Value
                };
                _._visualCollection.Add(bar);

                if (_.MaxData < item.Value)
                    _.MaxData = item.Value;
            }

            if (_.Orientation == Orientation.Horizontal)
                _.Ratio = _.Width / _.MaxData;
        }
    }