使用通用对象初始化非泛型对象

时间:2017-05-30 07:06:11

标签: c# wcf generics constructor

有时我没有得到C#Generics <script id="gridtemplate" type="text/x-kendo-template"> <tr> <td> #= firstname # </td> <td> #= surname # </td> <td> #= birthdate # </td> <td> #= classname # </td> #=foreach(var r in results) { //if r.assessmentid == assessment in header (mapdetails) <td>r.resultvalue</td> else <td></td> } # </tr> 的权利。我有一个通用的结构

T

public struct ValueWithUnit<T> { public ValueWithUnit(T _value, Unit _unit) { Unit = _unit; Value = _value; } public Unit Unit { get; } public T Value { get; } } Unitenum应该是数字,但没有可用于此目的的约束)。

对于WCF,我需要一个非泛型版本,TT。所以我想到了:

double

但是第二个构造函数没有编译: public struct DoubleValueWithUnit { public DoubleValueWithUnit(double _value, Unit _unit) { Unit = _unit; Value = _value; } public DoubleValueWithUnit(ValueWithUnit<T> _valueWithUnit) { Unit = _valueWithUnit.Unit; Value = Convert.ToDouble(_valueWithUnit.Value); } public Unit Unit { get; set; } public double Value { get; set; } } 和Convert.ToDouble抱怨 error CS0246: The type or namespace name 'T' could not be found ...

我知道我可以在泛型类中添加转换方法:

Cannot resolve method 'ToDouble(T)' Candidates are...

有效。但是有没有可能将带有泛型参数的构造函数添加到非泛型类/ struct?

3 个答案:

答案 0 :(得分:2)

我认为这个构造函数根本不存在:

DefaultDrawSortGlyph

为什么要将compile 'com.android.support:appcompat-v7:25.0.0' compile 'com.android.support.constraint:constraint-layout:1.0.0-alpha8' compile 'com.android.support:design:25.0.0' compile 'com.google.firebase:firebase-storage:10.2.4' compile 'com.github.bumptech.glide:glide:4.0.0-RC0' compile 'com.google.firebase:firebase-storage:10.2.4' 转换为public DoubleValueWithUnit(ValueWithUnit<T> _valueWithUnit) { Unit = _valueWithUnit.Unit; Value = Convert.ToDouble(_valueWithUnit.Value); } ?使用ValueWithUnit<T>的某些值,这没有意义。如何将DoubleValueWithUnit转换为T?还是BinaryFormatterdouble?在编译时不应该允许这些。

所以你要么这样做:

Form

或者一起删除构造函数。

答案 1 :(得分:0)

在第二个例子中,T根本没有定义。所以你不能在该结构的上下文中使用T.

只需删除此构造函数:

public DoubleValueWithUnit(ValueWithUnit<T> _valueWithUnit)

由于您希望转换传递给Double的任何内容,因此定义一个构造函数作为对象的输入。在构造函数中,如果对象不可转换,请尝试强制转换并抛出异常。

public DoubleValueWithUnit(object obj, Unit unit)
{
    Unit = unit;
    try
    {
       Value = Convert.ToDouble( obj );
    }
    catch( Exception )
    {
       throw new ArgumentException("Cannot convert to double", nameof(obj) );
    }        
}

答案 2 :(得分:0)

我目前的解决方案是让结构实现一个通用接口,该接口继承自非通用接口:

public struct ValueWithUnit<T> : IValueWithUnit<T> {...}

public interface IValueWithUnit<out T> : IValueWithUnit // where T: number
{
    new T Value { get; }
}
public interface IValueWithUnit
{
    object Value { get; }
    Unit Unit { get; }
}

现在,我可以将ValueWithUnit<T>传递给(已修改的)构造函数:

public DoubleValueWithUnit(IValueWithUnit _valueWithUnit)
{
    Unit = _valueWithUnit.Unit;
    Value = Convert.ToDouble(_valueWithUnit.Value);
}

我仍然不确定是否有更好的解决方案。