我有一个返回对象的泛型方法。在某些情况下,我希望这个对象是一个列表,因此我希望访问该对象的列表属性。为了能够做到这一点,我需要将对象转换为对象类型。
我有一个有数据的对象
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列表。
答案 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。