使用动态关键字转换为值类型...抛出异常

时间:2018-02-25 01:35:10

标签: c# dynamic

很抱歉这个很长的问题:

我有一些类都将InnerObject作为属性。

public class MyInt
{
    int InnerObject;
}
public class MyLong
{
    long InnerObject;
}
public class MyString
{
    string InnerObject;
}

依旧......

请不要告诉我我可以使用泛型,或者不要问我为什么需要这些课程。请阅读我的问题。

我有一个名为Foo的类,它有一个名为ProcessSomething的方法:

public class Foo
{
    void Process(MyInt value)
    {  
      ...
    }
}

现在我有一个框架代码,我想写一些像这样的代码 -

我想写这样的代码:

int myValue = 100;
MyInt myInt = new MyInt();
myInt.InnerObject = myValue;
myFoo.Process(myValue );

非常好,但我有许多不同类型的类及其功能,我可能需要传递MyString,MyLong等......

为了简化这一点,我尝试创建一个这样的Utility类:

public static class MyTypes
{
   public static dynamic Convert<T>(T i)
   {
      dynamic x = new ExpandoObject();
      x.InnerObject = i;
      return x;
    }
}

我的意图是我可以编写这样的代码:

myFoo.Process(MyTypes.Convert<int>(myValue));

所有这些代码都按预期编译,但在运行时,我执行上面的行时会出现异常。 无法将类型'System.Dynamic.ExpandoObject'隐式转换为'iInt32'

当我尝试将Convert方法修改为:

public static K Convert<T,K>(T i)
{
    dynamic x = new ExpandoObject();
    x.InnerObject = i;
    return (K)x;
}

并像这样称呼它(即使我不喜欢它,但我试着看看我是否可以使它工作)     myFoo.Process(MyTypes.Convert(myvalue的));

我仍然得到例外: 无法将类型'System.Dynamic.ExpandoObject'转换为'iInt32'

显然,我不理解某些事情。非常感谢能够帮助澄清我的理解。

2 个答案:

答案 0 :(得分:1)

请勿创建ExpandoObject,不是MyIntMyLong等,因此无法将其投放到这些类中。

您可以向MyTypes.Convert<T>添加new constraint,并使用new T()创建要返回的对象:

public static K Convert<T,K>(T i) where K : new()
{
    dynamic x = new K();
    x.InnerObject = i;
    return (K)x;
}

答案 1 :(得分:0)

我不确定我理解你想要完成什么,或者是否可能,但我可以对这个问题有所了解。

dynamic x = new ExpandoObject();
x.InnerObject = i;
return (K)x;

当您使用int为通用类型参数K调用此代码时,最后一行将尝试将ExpandoObject转换为int。没有定义这样的转换,所以它失败了。

是否有某些原因导致您无法使用myFoo.Process(new MyInt(...))