1. C# / Говнокод #6019

    +116

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    // Method that returns anonymous type as object
    object ReturnAnonymous() {
      return new { City="Prague", Name="Tomas" };
    }
    
    void Main() {
      // Get instance of anonymous type with 'City' and 'Name' properties
      object o = ReturnAnonymous();
    
      // This call to 'Cast' method converts first parameter (object) to the
      // same type as the type of second parameter - which is in this case 
      // anonymous type with 'City' and 'Name' properties
      var typed = Cast(o, new { City="", Name="" });
      Console.WriteLine("{0}, {1}", typed.City, typed.Name)
    }
    
    // Cast method - thanks to type inference when calling methods it 
    // is possible to cast object to type without knowing the type name
    T Cast<T>(object obj, T type) {
      return (T)obj;
    }

    via http://social.msdn.microsoft.com/forums/en-US/linqprojectgeneral/thread/c1c179bb-ea88-4633-970a-947f0dd1e71f/

    Запостил: Jopa123, 18 Марта 2011

    Комментарии (9) RSS

    • что тут гавнокод?

      многих давно мучает вопрос как же всё таки вернуть из метода анонимный тип. ответ "никак" их не устраивает
      Ответить
      • Многих давно мучает вопрос как туалетным ершиком полоть грядки. ответ "никак" их не устраивает. Анонимыне объекты не предназначены для таскания их по методам. То что выше - по сути мапирование анонимного объекта в обычный типизированный ценой анальных мук. Зачем и почему, для меня до сих пор загадка.
        Ответить
        • Ну в других языках можно же :) (HaXe)
          typedef SomeType = { foo:String; bar:Int }
          
          class Foo implements SomeType
          {
          	function new() { }
          
          	static function create():Foo { return new Foo(); }
          }
          
          class Bar
          {
          	static function testType(foo:SomeType):Void
          	{
          		trace(foo);
          	}
          
          	static function test():Void
          	{
          		test(Foo.create());
          		test({ foo: "Hello!", bar: 100 });
          	}
          }
          Ответить
          • static function test():Void
            	{
            		testType(Foo.create());
            		testType({ foo: "Hello!", bar 100 });
            	}
            Ответить
          • typedef дает типу имя.
            Ответить
            • Неа, typedef - просто для того, чтобы меньше писать, можно было бы написать и так:
              class Foo implements { foo:Int, bar:String }
              {
              . . .
              }

              Так бы тоже работало, только каждый раз писать полностью определение типа замучаешься :)
              Ответить
        • | ценой анальных мук.
          Автору видимо они доставляют - даже прокомментировать код не поленился.
          Ответить
      • Почему никак?
        dynamic o = ReturnAnonymous();
        Console.WriteLine("{0}, {1}", o.City, o.Name)
        Ответить

    Добавить комментарий