Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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# 我的泛型类型转换器气味不好,运行时出现异常,对象为catch all,装箱等_C#_.net_Generics_Extension Methods_Type Conversion - Fatal编程技术网

C# 我的泛型类型转换器气味不好,运行时出现异常,对象为catch all,装箱等

C# 我的泛型类型转换器气味不好,运行时出现异常,对象为catch all,装箱等,c#,.net,generics,extension-methods,type-conversion,C#,.net,Generics,Extension Methods,Type Conversion,首先,但是meta.stackoverflow.com似乎认为是这样,所以我们来看看。如果/当我得到答案时,我会更新这两个 我正在做很多简单类型之间的转换,我希望尽可能地处理好它。我认为最好能做这样的事情: var converter = GetMySingletonConverterRegistryPlease(); var somePoint = GetMeSomePointFromSomewhereThanks(); converter.Register<Point, List&l

首先,但是meta.stackoverflow.com似乎认为是这样,所以我们来看看。如果/当我得到答案时,我会更新这两个

我正在做很多简单类型之间的转换,我希望尽可能地处理好它。我认为最好能做这样的事情:

var converter = GetMySingletonConverterRegistryPlease();
var somePoint = GetMeSomePointFromSomewhereThanks();

converter.Register<Point, List<int>>( 
  point => new List<int>{ point.X, point.Y } 
); 

var someInts = somePoint.To<List<int>>();
var converter=GetMySingletonConverterRegistryPlease();
var somePoint=getmesomepointfromSomeWhereThank();
转换器.寄存器(
point=>新列表{point.X,point.Y}
); 
var someInts=somePoint.To();
因此,我提出了以下建议。对此我一点也不满意,并希望得到一些建议(我将在代码片段之后列举我不喜欢它的原因)

公共密封类TypeConverterRegistry:TypeConverterRegistryBase{
公共静态只读TypeConverterRegistry实例=新建
TypeConverterRegistry();
静态TypeConverterRegistry(){}
TypeConverterRegistry(){}
}
公共抽象类TypeConverterRegistryBase{
专用只读字典_converters=新建
字典();
公共无效寄存器(Func转换器){
var key=new{From=typeof(TFrom),To=typeof(TTo)};
_转换器[键]=转换器;
}
公共TTo转换到(对象来自){
var key=new{From=From.GetType(),To=typeof(TTo)};
如果(!\u转换器。容器(键))
抛出新的KeyNotFoundException(
“尚未注册接受”+键的转换器。从+
并返回一个“+key.To”);
var转换器=_转换器[键];
返回(TTo)转换器。动态Voke(来自);
}
}
公共静态类扩展{
公共静态TTo到(此对象值){
返回TypeConverterRegistry.Instance.ConvertTo(值);
}
}  
我不喜欢我在这里所做的,因为它不是强类型/约束的,很容易意外地误用它并获得运行时异常,我使用对象作为一个包罗万象的工具,而且我对调用DynamicInvoke和装箱结果的方式也有不好的感觉。毫无疑问,你们会看到更多的问题!另外,我对在对象上创建扩展方法感到很遗憾

我喜欢的是结果语法

所以我真的很感激任何建议,即使只是朝着正确的方向轻推一下

或者保证这毕竟不是一个糟糕的方法:看看AutoMapper(http://automapper.codeplex.com/). 虽然意图不同,但您的项目有很多共同点,您可以从他们的模式和代码中获得很多

就运行时异常而言,这可能归结为单元测试,因为您依赖于用户在使用之前注册类型。这是没有办法的,这和AutoMapper做的一样,但他们也提供了一些测试材料

我强烈建议将ConvertTo方法重写为泛型,以便from参数是泛型的,而不是类型对象。你可以这样做:

  public TTo ConvertTo<TFrom, TTo>( TFrom from ) {
    var key = new { From = typeof( TFrom ) To = typeof( TTo ) };

    if( !_converters.ContainsKey( key ) ) 
      throw new KeyNotFoundException( 
        "No converter has been registered that takes a " + key.From + 
        " and returns a " + key.To );

    var converter = _converters[ key ] as Func<TFrom, TTo>;
    return converter(from);
  }
public-TTo-ConvertTo(从中转换){
var key=new{From=typeof(TFrom)To=typeof(TTo)};
如果(!\u转换器。容器(键))
抛出新的KeyNotFoundException(
“尚未注册接受”+键的转换器。从+
并返回一个“+key.To”);
var converter=_converters[key]作为Func;
返回转换器(来自);
}
这也可以通过扩展方法解决您的问题。现在可以使用以下命令调用:

public static TTo Convert<TFrom, TTo>(this TFrom value){
return TypeConverterRegistry.Instance.Convert<TFrom, TTo>(value);
}
公共静态TTo转换(此TFrom值){
返回TypeConverterRegistry.Instance.Convert(值);
}

这就是我最初编写代码的方式,但我爱上了somethingElse.To()的清晰性;也许我需要意识到我不能既吃馅饼又吃馅饼?我将屏息等待任何其他建议,但遗憾的是,我怀疑您可能是对的,而且从代码质量的角度来看,以我的方式使用语法是不现实的:)哦,也是吗?已经在使用AutoMapper做其他事情:)我很惊讶我还没有意识到有多少重叠,我会进一步研究。我理解为什么使用扩展方法来表示SomeObj.to()可能很可爱,但AutoMapper的模式很好用,在我看来也很好——只是一个静态方法,在你的例子中,比如Converter.Convert(从,到)。是的,我觉得我太珍贵了。谢谢你的意见!
public static TTo Convert<TFrom, TTo>(this TFrom value){
return TypeConverterRegistry.Instance.Convert<TFrom, TTo>(value);
}