C# 4.0 在C#4中的方法的静态参数中传递动态变量

C# 4.0 在C#4中的方法的静态参数中传递动态变量,c#-4.0,dynamic,C# 4.0,Dynamic,这就是我想做的: public void method(int myVal, string myOtherVal) { // doing something } dynamic myVar = new SomeDynamicObjectImplementer(); method(myVar.IntProperty, myVar.StringProperty); 请注意,我的属性也是动态对象。我的问题是TryConvert方法从未被调用,并且我得到一个运行时错误,说方法签名无效 以下几点非

这就是我想做的:

public void method(int myVal, string myOtherVal)
{
  // doing something
}

dynamic myVar = new SomeDynamicObjectImplementer();
method(myVar.IntProperty, myVar.StringProperty);
请注意,我的属性也是动态对象。我的问题是TryConvert方法从未被调用,并且我得到一个运行时错误,说方法签名无效

以下几点非常有效:

string strVar = myVar.StringProperty;
int intVar = myVar.IntProperty;
我想避免

method((int)myVar.IntProperty, (string)myVar.StringProperty);
是否可以覆盖DynamicObject中的某些内容以允许此操作?(或者别的什么)


谢谢你

而不是使用
myVar.IntProperty
你能不能先把它们放在变量中,就像你已经做的那样,然后用它们作为你的方法

so
方法(intVar,strVar)似乎很好。至少比铸造更优雅


当然,如果您已经确定对象将具有
IntProperty
StringProperty
,为什么不使用这些属性创建一个实际对象呢?

问题在于您假设它将尝试对动态调用的参数进行动态隐式转换,以使方法调用工作,事实并非如此

当参数不是静态类型时,它将使用运行时类型来查找最佳匹配方法(如果运行时类型与隐式转换为参数类型的静态规则匹配,这也会起作用),因为您的IntProperty,StringProperty似乎返回的是DynamicObject,而不是Int和字符串或其他可以静态隐式转换的对象,此查找将失败

如果SomeDynamicObjectImplementer可以实际返回IntProperty的Int和StringProperty的String,那么您在不强制转换的情况下调用的方法将实际起作用。如果您的数据类型基于实际的数据类型,而不是使用try convert,那么这可能也是一种更好的动态类型实践。您可以为每个可能返回到返回的DynamicObject类型的类型添加实际的隐式转换方法,但这可能会导致奇怪的解析问题,具体取决于您的重载程度

然而,保持动态实现不变的另一个选项是混合一些受控的静态类型,您可以使用ImpromputInterface(在nuget中)来放置一个,如果这样做,那么TryConvert方法将在返回的dynamicobject上被调用

public interface ISomeStaticInterface{
      int IntProperty {get;}
      string StringProperty {get;}
}
...
var myVar = new SomeDynamicObjectImplementer().ActLike<ISomeStaticInterface>();
method(myVar.IntProperty, myVar.StringProperty);
公共接口{
int属性{get;}
字符串StringProperty{get;}
}
...
var myVar=new SomeDynamicObjectImplementer().ActLike();
方法(myVar.IntProperty、myVar.StringProperty);

你为什么要选演员

方法(myVar.IntProperty、myVar.StringProperty)

应该编译


如果这两个属性必须是名称所建议的类型,那么它们不应该是动态的

它确实可以编译,但在运行时会中断。我执行强制转换是为了在运行时强制进行类型转换。我可以将它们放在静态变量中,也可以执行强制转换,这样就可以了。我试图避免对这里的每个参数都使用变量或强制转换。例如,如果我把它们放在一个静态变量中,我不必强制转换,所有的事情都会正常工作。为什么我必须为方法调用强制转换?这是我的问题。另外,在这里使用dynamic的全部目的是不必创建一堆DTO和解析/转换代码来传递数据。谢谢,我昨天了解到了这一点,您也证实了这一点。我会看看我能做些什么也许我能在“SomeDynamicObjectImplementer”上实现一些东西。