如何将对象转换为类型

本文关键字:类型 转换 对象 | 更新日期: 2023-09-27 18:12:41

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

我有一个对象有数据

object obj

我正在尝试:

Type t = obj.GetType();
var t1 = (t)obj;

为了访问对象的列表属性:

 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();

这是可行的,但类型未知,我想找到类型,转换它,然后返回我想要的列表。

如何将对象转换为类型

我认为这是泛型方法实现中的一个问题。如果你使用的是纯粹的自定义对象,一个界面可以解决你的所有问题:

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的对象,并返回类型为IMtask的通用对象。

如果你使用.Net类,那么问题就在于你要返回什么类型的对象以及你想将其强制转换为什么。你提到了List,但另一种返回类型是什么?字符串和列表之间的转换可能会有点问题,使用可能会更好

A( 将其包裹在自定义对象中或B( 将此逻辑添加到您的工作方法中。

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

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。