C# 对泛型和类型有点困惑

C# 对泛型和类型有点困惑,c#,C#,我想这样做(大大简化了代码): 公共类MyClass { 私有类型_listingType=typeof(仿古列表); 公共删除实体(int-id) { //这是我想做的,但它没有编译 SystemLogic.DeleteItem(id); //但这是真的 SystemLogic.DeleteItem(id); } } DeleteItem方法定义如下: public void DeleteItem<T>(int primaryKeyValue) where T : cla

我想这样做(大大简化了代码):

公共类MyClass
{
私有类型_listingType=typeof(仿古列表);
公共删除实体(int-id)
{
//这是我想做的,但它没有编译
SystemLogic.DeleteItem(id);
//但这是真的
SystemLogic.DeleteItem(id);
}    
}
DeleteItem方法定义如下:

public void DeleteItem<T>(int primaryKeyValue) where T : class
public void DeleteItem(int primaryKeyValue),其中T:class

这里我可能缺少一些简单的东西,但我不确定如何做我想做的事情。

类型必须是编译时表达式,以便运行时可以为该方法生成代码。这是因为运行时不能保证在生成代码之前定义变量。例如,Ngen工具允许在不运行任何代码的情况下预编译代码。

您可能需要添加一个描述“通用”方法的接口。只要类型满足接口的约定,就可以了

public interface IListing
{
    void DeleteItem(int id);
}

public AntiqueSellerListing : IListing
{
    public void DeleteItem(int id)
    {
        ... delete logic
    }
}

public class MyClass
{
    public void DeleteEntity<T>(T listing, int id)
        where T : IListing
    {
        SystemLogic.DeleteItem<T>(listing, id);
    }    
}

public static class SystemLogic
{
    public void DeleteItem<T>(T listing, int id)
        where T : IListing
    {
        listing.DeleteItem(id);
    }  
}
公共接口初始化
{
无效删除项(内部id);
}
公共古董目录:IListing
{
公共无效删除项(内部id)
{
…删除逻辑
}
}
公共类MyClass
{
公共void DeleteEntity(T列表,int id)
其中T:IListing
{
SystemLogic.DeleteItem(列表,id);
}    
}
公共静态类系统逻辑
{
公共void DeleteItem(T列表,int id)
其中T:IListing
{
listing.DeleteItem(id);
}  
}

我已经在bat上写下了这一点,但总体思路是这样的。

您需要运行时类型(相对于通过
typeof
获得的编译时类型)有什么原因吗?如果真是这样的话,你可能应该使用多态性而不是泛型。为什么你想使用前者而不是后者?在我看来,你只是想让DeleteEntity成为泛型,但在给定的示例中,你是在硬编码,因此很难看到类型会发生怎样的变化(假设会发生变化)。也许可以做一些关于泛型与反射的研究?它们是两个完全不同的东西。我明白为什么会有困惑,但当你理解了这两个问题,你就会明白为什么
public interface IListing
{
    void DeleteItem(int id);
}

public AntiqueSellerListing : IListing
{
    public void DeleteItem(int id)
    {
        ... delete logic
    }
}

public class MyClass
{
    public void DeleteEntity<T>(T listing, int id)
        where T : IListing
    {
        SystemLogic.DeleteItem<T>(listing, id);
    }    
}

public static class SystemLogic
{
    public void DeleteItem<T>(T listing, int id)
        where T : IListing
    {
        listing.DeleteItem(id);
    }  
}