2012-05-30 28 views
12

Anonim nesneyi bir yöntemde argüman olarak geçirme konusunda bir sorunum var. Nesneyi JavaScript’te olduğu gibi geçmek istiyorum. Örnek:Anonim bir nesneyi bağımsız değişken olarak geçirme C#

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

İstisnalar:

  1. Tartışma 1: için 'AnonymousType 1.' dan dönüştürmek olamaz 'System.Collections
    function Test(obj) { 
        return obj.txt; 
    } 
    console.log(Test({ txt: "test"})); 
    

    Ama C#

    , birçok istisnalar atar .Generic.IEnumerable '
  2. ' ConsoleApplication1.Test.TestMethod (System.Collect) için en iyi aşırı yüklenmiş yöntem eşleşmesi ions.Generic.IEnumerable) txt 've uzatma yöntemi 'txt' türü bir birinci argüman kabul 'için tanımlama içermez' System.Collections.Generic.IEnumerable' bir geçersiz değişkenler
  3. bulunur Sistemi .Collections.Generic.IEnumerable' bulunamadı (bir kullanarak emrini veya bir derleme başvurusu eksik?) istediğin gibi görünüyor
+2

Neden IEnumerable isteyen bir yönteme anonim nesne geçiyoruz? Sadece 'dinamik' – GregRos

+0

@ GregRos kabul ediyorum, sadece ben şiddetle yazılan dillerinde yeni ve araştırmalarım bana şunu gösteriyor ... – user1091156

cevap

17

:

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

sen olarak kullanıyorlar eğer bir si ngle değeri, bir sıra değil. Gerçekten bir dizi istiyor musun?

3

Bu işler ince :)

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

Teşekkür ederim, mükemmel çalışıyor. Sadece bir şey yazmak için kaç seçenek var şok oldum :) – user1091156

+0

Sadece ilk madde kapmak için gidiyoruz neden ilk sırada bir numaralanabilir almak? – Servy

+0

@Servy Burada sadece bir gözlemci bunun üzerine tökezliyor ama sadece bir test; önemli değil. IMO, IEnumerable ile sınanması iyidir, çünkü yeni [] {new {..}} kullanarak sözdizimsel nesnelerin genellikle setler halinde nasıl geçtiğini söyleyen sözdizimi kuralı ortaya çıkar. Aslında görmem gereken şey bu; Onu 'params' param olarak kullanıyorum. –

8

Bu yapmalıyım ...

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; 
    } 
}