【问题标题】:Call generic class function from outside从外部调用泛型类函数
【发布时间】:2020-04-07 11:16:30
【问题描述】:

我正在为第 3 方数据库创建接口。我在 C# 中遇到了基本的类问题。在这种情况下,我无法获得通用类工作。

我有这样的代码:

class Program
{
    static void Main(string[] args)
    {
        Collection collection= new Collection();
        collection.Save();
    }
}

public class Collection : CollectionBase
{
    public DataTable<ItemA> itemA = new DataTable<ItemA>();
    public DataTable<ItemB> itemB = new DataTable<ItemB>();
}

public class CollectionBase
{ 
    public void Save()
    {
        var MyFields = this.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);

        foreach (var Field in MyFields)
        {
            if (Field.FieldType.IsGenericType && Field.FieldType.GetGenericTypeDefinition() == typeof(DataTable<>))
            {
                var ItemInstance = Field.GetValue(this);
                //ItemInstance.SaveAll(); //<--This is Missing
                var Item = ItemInstance as DataTable<BaseItem>; //<-- Returns null, debuger says this is DataTable<ItemA> (or ItemB at second loop)
                Item.SaveAll(); //<--(And fails for null exception, of cource)
            }
        }

    }
}

public class DataTable<T>
{
    public IQueryable<T> Where(Expression<Func<T, bool>> condition)
    {
        //...
        return null;
    }
    public void SaveAll() { }
}

public class BaseItem
{}
public class ItemA : BaseItem
{}
public class ItemB : BaseItem 
{}

Field.GetValue(this) 返回正确的实例,但我找不到调用 DataTable 的 SaveAll 函数的方法。

这可能吗?

我知道我可以通过将自己的 Save 函数(本例)添加到 Collection 类来解决这个问题,但我真的不想这样编写代码。

【问题讨论】:

    标签: c# type-conversion


    【解决方案1】:

    您的DataTable&lt;T&gt; 类不是协变的,因此您不能将DataTable&lt;Derived&gt; 类型的对象分配给DataTable&lt;Base&gt; 的变量。

    事实上,.NET 根本不支持 中的泛型类型变化。

    你可以做的是创建一个协变接口,使用 out 关键字:

    IDataTable<out T>
    {
        void SaveAll();
    }
    

    然后让你的DataTable&lt;T&gt; 实现它:

    public class DataTable<T> : IDataTable<T>
    

    那么你可以这样做:

    var item = ItemInstance as IDataTable<BaseItem>;
    item.SaveAll();
    

    更多信息:Covariance and Contravariance in Generics

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-12
      • 1970-01-01
      • 1970-01-01
      • 2011-02-18
      • 2011-05-10
      相关资源
      最近更新 更多