无法将类型'T'隐式转换为'对象'

时间:2017-03-14 22:22:08

标签: c#

我有以下课程:

public class HashmapArraylist {

public static void main(String[] args) throws Exception {

    Map<String, Object> map1 = new HashMap<>();
    map1.put("id", 1);
    map1.put("sku", "test1");
    map1.put("quantity", 1);

    Map<String, Object> map2 = new HashMap<>();
    map2.put("id", 2);
    map2.put("sku", "test2");
    map2.put("quantity", 2);

    Map<String, Object> map3 = new HashMap<>();
    map3.put("id", 3);
    map3.put("sku", "test3");
    map3.put("quantity", 3);

    ArrayList<Map<String, Object>> arrayList = new ArrayList<>();
    arrayList.add(map1);
    arrayList.add(map2);
    arrayList.add(map3);

    printArrayList(arrayList);
}

public static void printArrayList(ArrayList<Map<String, Object>> arrayList) {

    for (Map<String, Object> entry : arrayList) {
        for (String key : entry.keySet()) {
            String value = entry.get(key).toString();
            System.out.println(key + " : " + value);
        }
        System.out.println("-----------");
    }
}
}

我尝试像这样创建一个TestClass对象:

public class TestClass
{
    public IEnumerable<Expression<Func<object, object>>> TestField { get; set; }
}

但我得到以下IntelliSense错误: 无法将类型'OtherClass'隐式转换为'object'

如何通过保持new TestClass { TestField = new Expression<Func<OtherClass, object>>[] { otherClass => otherClass.FieldX, otherClass => otherClass.FieldY } } 定义的通用性来实现这一点,以便我可以创建一个TestClass对象,例如TestClassOtherClass或任何其他类?

2 个答案:

答案 0 :(得分:2)

您不能将一种类型的泛型类强制转换为派生类型的泛型类。仅仅因为类的泛型类型通过继承连接并不意味着类本身就是。例如,您无法将List<Apple>强制转换为List<Fruit>,因为就程序而言,这两个列表是完全不同的类。

在您的情况下,您可以通过TestClass本身通用来解决您的泛型问题:

public class TestClass<T>
{
    public IEnumerable<Expression<Func<T, object>>> TestField { get; set; }
}

然后您可以像这样创建TestClass的实例:

new TestClass<OtherClass>
{
    TestField = new Expression<Func<OtherClass, object>>[]
    {
        otherClass => otherClass.FieldX,
        otherClass => otherClass.FieldY
    }
}

答案 1 :(得分:0)

喜欢这个吗?

new TestClass
{
    TestField = new Expression<Func<object, object>>[]
    {
            otherClass => ((OtherClass)otherClass).FieldX,
            otherClass => ((OtherClass)otherClass).FieldY
    }
};