2012-05-30 23 views
12

Tôi gặp sự cố khi chuyển đối tượng ẩn danh làm đối số trong phương thức. Tôi muốn truyền đối tượng như trong JavaScript. Ví dụ:Truyền đối tượng ẩn danh làm đối số trong C#

function Test(obj) { 
    return obj.txt; 
} 
console.log(Test({ txt: "test"})); 

Nhưng trong C#, nó ném nhiều ngoại lệ:

class Test 
{ 
    public static string TestMethod(IEnumerable<dynamic> obj) 
    { 
     return obj.txt; 
    } 
} 
Console.WriteLine(Test.TestMethod(new { txt = "test" })); 

Exceptions:

  1. Đối số 1: không thể chuyển đổi từ 'AnonymousType # 1' để 'System.Collections .Generic.IEnumerable '
  2. Kết hợp phương pháp quá tải tốt nhất cho ' ConsoleApplication1.Test.TestMethod (System.Collect ions.Generic.IEnumerable) ' có một số đối số không hợp lệ
  3. 'System.Collections.Generic.IEnumerable' không chứa một định nghĩa cho 'txt' và không có phương pháp mở rộng 'txt' chấp nhận một số đầu tiên của loại' Hệ thống .Collections.Generic.IEnumerable' thể được tìm thấy (là bạn thiếu một chỉ thị sử dụng hoặc tham khảo một hội ?)
+2

Tại sao các bạn đi qua một đối tượng vô danh đến một phương pháp mà muốn IEnumerable? làm cho nó chấp nhận chỉ 'động' – GregRos

+0

@GregRos cảm ơn bạn, chỉ là tôi mới trong ngôn ngữ gõ mạnh mẽ và nghiên cứu của tôi cho tôi thấy điều này ... – user1091156

Trả lời

17

Dường như bạn muốn:

class Test 
{ 
    public static string TestMethod(dynamic obj) 
    { 
     return obj.txt; 
    } 
} 

bạn đang sử dụng nó như là nếu đó là si ngle giá trị, không phải là một chuỗi. Bạn có thực sự muốn một chuỗi?

3

này hoạt động tốt :)

public class Program 
{ 
    private static void Main(string[] args) 
    { 
     Console.WriteLine(Test.TestMethod(new[] {new {txt = "test"}})); 
     Console.ReadLine(); 
    } 
} 

public class Test 
{ 
    public static string TestMethod(IEnumerable<dynamic> obj) 
    { 
     return obj.Select(o => o.txt).FirstOrDefault(); 
    } 
} 
+0

Cảm ơn bạn, công trình hoàn hảo. Tôi chỉ bị sốc khi có bao nhiêu lựa chọn để viết một điều :) – user1091156

+0

Nếu bạn chỉ định lấy món hàng đầu tiên, tại sao phải lấy số đếm đầu tiên? – Servy

+0

@Servy Chỉ cần một người quan sát ở đây tình cờ gặp phải điều này ngay bây giờ nhưng nó chỉ là một thử nghiệm; nó không quan trọng. IMO rất tốt để thử nghiệm với IEnumerable vì nó chứng minh quy ước cú pháp của việc sử dụng [] {new {..}} mới, đó là cách các đối tượng ẩn danh thường được truyền trong tập hợp. Trong thực tế, đây là những gì tôi cần xem; Tôi đang sử dụng nó như một param 'params'. –

8

này nên làm điều đó ...

class Program 
{ 
    static void Main(string[] args) 
    { 
     var test = new { Text = "test", Slab = "slab"}; 
     Console.WriteLine(test.Text); //outputs test 
     Console.WriteLine(TestMethod(test)); //outputs test 
    } 

    static string TestMethod(dynamic obj) 
    { 
     return obj.Text; 
    } 
}