是否可以实现自定义安全类型转换(在任意抽象数据结构之间使用“ as”)? - c#

今天,我们有一组在处理从/到客户端的数据传输时转换为彼此类型的类。转换范例是在目标的构造函数中实现的(即,每个对象都知道如何根据输入的类型创建自己)。我们故意拒绝对象知道如何将自己转换为目标类型的想法(即,每个对象都有一组ToTypeXyz()方法),因为在我们看来,出于维护目的起见,这更有意义。

class ThisType
{
  public ThisType() { ... }
  public ThisType(ThatType input) { ... }
  ...
}

class ThatType
{
  public ThatType() { ... }
  public ThatType(ThisType input) { ... }
  ...
}

我正在考虑淘汰所有转换逻辑以集中所有工作。一种选择是引入带有静态方法的实用程序类(特殊情况是扩展方法,以获得更好的编码经验)。

但是,如果可以通过安全转换(即像波纹管样品一样)进行转换,则在我们的情况下会更好。它还可以提高性能并降低出现例外情况的风险,I think。

ThisType input = new ThisType();
...
ThatType target = input as ThatType;

但是,当我搜索“ custom safe cast c#”时,没有得到任何相关结果,可能会淹没在标准案例中。有可能吗?

参考方案

是的,使用隐式/显式conversion operator:

class ThatType
{
    public ThatType() { ... }
    public ThatType(ThisType input) { ... }
    ...

    public static implicit operator ThatType(ThisType t) => new ThatType(t);
}

使用上面的隐式版本,这将起作用:

ThisType input = new ThisType();
ThatType target = input;

尽管遗憾的是as运算符不起作用,因为它不遵守用户定义的转换。

Web应用程序上的恶意用户是否可以操纵Web应用程序前端发送的输入(在表单数据旁边)? - java

Web应用程序上的恶意用户是否可以通过任何可能的方式来操纵Web应用程序前端发送的输入(当然,这不是在谈论FORM DATA),但是发送的请求例如当我允许他编辑他的个人资料或他的内容时,他可能会操纵ID(userId或contentId),从而可能恶意地对其他用户的内容进行邪恶?这些输入固定在网页上并且不可编辑,但用户仍然可以操纵它们吗?用户是否可能以这种方…

什么时候在Hibernate中调用flush()和commit()? - java

我有以下情况: openSession() tx = session.beginTransaction(); try { ... session.saveOrUpdate(obj_1); ... session.saveOrUpdate(obj_2); ... session.saveOrUpdate(obj_3); session.flush(); tx.…

如何在“后台”中运行脚本的一部分(单个函数)? - python

我在具有以下基本结构(伪代码)的服务器上运行python脚本:for data_item in data_items: processed_result=process_data(data_item); #this takes time T0 upload_result_to_site(processed_result) #this takes time T…

为什么在Python中根据@staticmethod选择模块级别的函数(根据Google样式指南)? - python

根据《 Google Python样式指南》,绝对不应(几乎)使用静态方法: 除非为了与 在现有库中定义的API。编写模块级功能 代替该建议背后的原因是什么?这是否仅适用于Google?还是在Python中使用静态方法还有其他(更一般的)缺点?尤其是,如果我想在将由该类的其他公共成员函数调用的类中实现实用程序功能,则最佳实践是什么?class Foo: ..…

mkvirtualenv命令是什么意思?是Linux命令还是python命令..? [关闭] - python

Closed. This question is off-topic。它当前不接受答案。                                                                                                                                        …