【问题标题】:C# - Anonymous object as 'out' parameter?C# - 匿名对象作为'out'参数?
【发布时间】:2021-02-05 18:55:16
【问题描述】:

我正在尝试将匿名对象设为“输出”参数。

这段代码编译:

public T GenericTest<T>(T Input)
{
  return Input;
}

public void AnonymousObjectTest()
{
  var AnonObj = new { Prop = "hello" };
  var Str = GenericTest(AnonObj).Prop;
  Console.WriteLine(Str); //outputs "hello" to the console
}

但是,我怎样才能让它工作?请参阅以下内容。我正在尝试使用匿名对象作为“OutParamTest”方法的“输出”参数。

老实说,它应该与返回泛型类型 T 没有什么不同,因为方法的输出类型被声明为与输入相同。但是,我不知道在方法调用中除了“object”之外使用哪种类型:

public void OutParamTest<T>(T Input, out T Output)
{
  Output = Input;
}

public void AnonymousObjectTest()
{
  var AnonObj = new { Prop = "hello" };

  OutParamTest(AnonObj, out object Test); //how can I make the 'out' parameter type the same as the 'input' parameter?

  var Str = Test.Prop; //CS1061: 'object' does not contain a definition for 'Prop'

  Console.WriteLine(Str);
}

【问题讨论】:

    标签: c# anonymous-types generic-type-argument out-parameters


    【解决方案1】:

    你可以:

    var obj = new { A = 1 };
    OutParamTest(obj, out var obj2);
    

    将 C# 3.0 中引入的 var 完全用于匿名类型,而 C# 7.0 中的 out 可以与 out 内联。

    在较旧的 C# 编译器上,您还可以:

    var obj = new { A = 1 };
    var obj2 = obj;
    OutParamTest(obj, out obj2);
    

    (作为引用类型的匿名类型,var obj2 = obj 很便宜)

    【讨论】:

    • 我只是随机尝试了 'var' 并在你发布这个答案之前让它正常工作,并且正要发布我自己的答案,但你打败了我。谢谢
    【解决方案2】:

    你可以试试动态类型。

    public static void OutParamTest<T>(T Input, out T Output)
    {
        Output = Input;
    }
    
    public static void AnonymousObjectTest()
    {
        var AnonObj = new { Prop = "hello" };
    
        OutParamTest(AnonObj, out dynamic Test);
    
        var Str = Test.Prop;
    
        Console.WriteLine(Str);
    }
    

    使用 Dynamic 类型,您可以访问 Type 中的 Prop。

    【讨论】:

    • 它确实有效,但使用动态会损失编译时的安全性和性能。
    猜你喜欢
    • 2020-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多