如何将动态用作通用?

如何将动态作为通用使用?

这个

var x = something not strongly typed; callFunction(); 

还有这个

 dynamic x = something not strongly typed; callFunction(); 

都产生这个错误

 Error 1 The type or namespace name 'x' could not be found (are you missing a using directive or an assembly reference?) 

我该怎么做才能使它足够合法用于

你可以使用类型推断来调用蹦床:

 dynamic x = something not strongly typed; CallFunctionWithInference(x); ... static void CallFunctionWithInference(T ignored) { CallFunction(); } static void CallFunction() { // This is the method we really wanted to call } 

这将根据x值的执行时类型在执行时确定类型参数,使用与x将其作为编译时类型时使用的相同类型的推断。 该参数用于进行类型推断工作。

请注意,与Darin不同,我相信这一种有用的技术 – 在完全相同的情况下,您需要使用reflection调用generics方法。 您可以使代码的这一部分动态化,但保持其余代码(从通用类型向下)类型安全。 它允许一步是动态的 – 只是您不知道类型的单个位。

很难说你到底想要做什么。 但是,如果要使用与某个对象相同的类型参数调用generics方法,则不能直接执行此操作。 但是你可以编写另一个方法,将你的对象作为参数,让dynamic推断出类型,然后调用你想要的方法:

 void HelperMethod(T obj) { CallFunction(); } … dynamic x = …; HelperMethod(x); 

你不能。 generics的全部内容是编译时安全性,这意味着必须在编译时知道它们。 动态的全部要点是你不需要在编译时知道确切的类型并使用运行时调度=>它与generics完全相反。 所以不要浪费你的时间=>一旦你获得了动态/reflection路径,就可以忘记generics和编译时的安全性。 你必须走这条路直到最后。

所以回答你的问题:

我能做些什么才能让它合法到足以使用?

你唯一能做的就是使用在编译时已知的类型,否则你不能使用generics。

你得到那个错误,因为x不是一个类型。 您需要将类型指定为类型参数。

实际上,如果正确使用,则可以dynamic用作类型参数:

 var dict = new Dictionary(); dict.Add("Item1", 123); dict.Add("Item2", "Blah"); 

这编译并运行得很好。

使这项工作最快捷的方法是让您的匿名类型成为真正的类型。

而不是

 var x = new { Value = "somevalue", Text = "sometext" }; 

你需要这样做

 class MyClass { string Text, Value; } .... var x = new MyClass() { Value = "somevalue", Text = "sometext" }; //this should work now callFunction(x); 

你应该能够像这样调用这个函数

 callFunction(); 

如果您的function定义为

 public void callFunction(T arg) { ... } 

您可以简单地调用它

 callFunction(x); 

C#能够在许多情况下推断generics类型参数。