Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何强制DTOs类型实现方法?_C#_Oop - Fatal编程技术网

C# 如何强制DTOs类型实现方法?

C# 如何强制DTOs类型实现方法?,c#,oop,C#,Oop,我想用C#7.3实现这样一种方法,以强制某些数据传输对象符合我的实现: public List<T> QueryOnDb<T>(DateTime dateRef) where T : baseDTO { string param = T.getParam(); List<string> resultJson = _context.Foo.Where(x=> x.type == param).Select(x

我想用C#7.3实现这样一种方法,以强制某些数据传输对象符合我的实现:

    public List<T> QueryOnDb<T>(DateTime dateRef) where T : baseDTO
    {
        string param = T.getParam();
        List<string> resultJson = _context.Foo.Where(x=> x.type == param).Select(x=> x.json).ToList();
        return resultJson.Select(x => JsonConvert.DeserializeObject<T>(x)).ToList();
    }
公共列表查询数据库(DateTime dateRef),其中T:baseDTO
{
字符串param=T.getParam();
List resultJson=_context.Foo.Where(x=>x.type==param);
返回resultJson.Select(x=>JsonConvert.DeserializeObject(x)).ToList();
}
显然它不会编译,因为C#不支持抽象类上的静态抽象方法

我想到的第一个解决方法是在QueryOnDb的签名上传递param,但是我可以让T和param不同


编辑1:添加了关于
getParam()
应为abstrat的说明。

可以使用反射,以便对泛型类中的静态方法的调用将链接到派生类中具有特定名称的静态方法(如果存在),或者如果不存在,则使用编程的回退操作。不可能让编译器拒绝无法定义具有特定名称的静态方法的派生类,但这与编译器无法拒绝在大多数其他方面违反继承要求的类相比,实际上并不是一个更大的问题


尽管反射以速度慢著称,但如果泛型类使用静态委托来标识要调用的函数,则性能可能相当好。该委托应初始化为一个函数,该函数将使用反射在泛型参数指定的类中查找静态方法,并将其存储在委托中。以后的调用可以直接使用该委托,而无需再次查找特定泛型类的方法。

C#不支持抽象类上的静态方法,实际上,它支持。看起来,您已经将泛型与抽象类混合在一起了。在版本8或更高版本中,代码中没有抽象类,而在版本7.3中不支持。我想在泛型上获取一个方法。
public抽象类Temp{public static string GetSomething(){return“hi”;}}
← 完全合法。使用静态方法抽象类。我不认为这在任何版本的c语言规范中都不受支持!我忘了说静态成员也应该是抽象的。
公共抽象类Temp{public abstract static string GetSomething();}}
不会编译。至少在我的C#版本上。我不想仅仅因为这一点就更新项目。是否有可能至少实现一个测试来强制基类的所有派生类实现这样的方法?