很抱歉这个很长的问题:
我有一些类都将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'
显然,我不理解某些事情。非常感谢能够帮助澄清我的理解。
答案 0 :(得分:1)
请勿创建ExpandoObject
,不是MyInt
,MyLong
等,因此无法将其投放到这些类中。
您可以向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(...))
?