如何将对象转换为类型?

时间:2016-10-12 14:50:12

标签: c# asp.net-mvc types generic-programming

我有一个返回对象的泛型方法。在某些情况下,我希望这个对象是一个列表,因此我希望访问该对象的列表属性。为了能够做到这一点,我需要将对象转换为对象类型。

我有一个有数据的对象

object obj

我在尝试:

Type t = obj.GetType();

var t1 = (t)obj;

为了访问对象上的list属性:

 Type t = obj.GetType();

  var t1 = (t)obj;

  return t1.items.Tolist();

我该怎么做?

编辑:

如果我已经知道类似的类型:

Type t = obj.GetType();

var t1 = (ApiResult<IEnumerable<AlarmLog>>)obj;

return t1.Items.ToList();

这可行,但类型未知,我希望找到类型,转换它然后返回我的desiered列表。

2 个答案:

答案 0 :(得分:3)

我认为这是您的通用方法实现的问题。如果您正在使用纯自定义对象,那么界面将解决您的所有问题:

public interface IMask {}

public class MyObject : IMask {}

public class Driver
{
    public static void main(string[] args)
    {
        Driver d = new Driver();
        MyObject mo = d.SomeMethod(/*some param*/);
    }

    public IMask<T> SomeMethod(/*some param*/) where T : IMask
    {
        //some code
        return new IMask();
    }
}

上面的代码段适用于自定义类。通过返回IMask,您可以安全地将其转换为从该接口继承的类型。实际完成工作的方法是完全通用的,因为它只接受IMask类型的对象并返回类型为IMask的通用对象。

如果您正在使用.Net课程,那么您将返回什么样的对象以及您希望将其投射到什么类型。你提到了一个List,但是其他的返回类型是什么?在字符串和列表之间进行转换可能会成为一个问题,而且

可能更好

A)将其包装在自定义对象中 要么 B)将此逻辑添加到您的工作方法中。

我们可能需要更多信息以更具体的方式回答这个问题。

答案 1 :(得分:2)

static bool TryCastAsList<T>(object input, out IList<T> output)
{
    IEnumerable inputAsIEnumerable = input as IEnumerable;
    if (inputAsIEnumerable != null)
    {
        output = inputAsIEnumerable.Cast<T>().ToList();
        return true;
    }
    else
    {
        output = null;
        return false;
    }
}

用作:

object o1 = new []{ 1, 2, 3, 4, 5 };
IList<int> l1;
if (TryCastAsList(o1, out l1))
{
    int n = l1.First(); // 1
}

object o2 = new[] { "Hello", "World" };
IList<string> l2;
if (TryCastAsList(o2, out l2))
{
    string s = l2.First();  // Hello
}

如果传递的对象是Enumerable,则TryCastAsList将所有元素转换为泛型类型T并返回true,否则返回false。