Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. Other Discussions
  3. The Weird and The Wonderful
  4. SetProperty!!!

SetProperty!!!

Scheduled Pinned Locked Moved The Weird and The Wonderful
csharpcomgraphicsdesigngame-dev
14 Posts 8 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • D Duncan Edwards Jones

    Not only that - because you have to refer to the property by name you also break compile time type-checking.

    Richard DeemingR Offline
    Richard DeemingR Offline
    Richard Deeming
    wrote on last edited by
    #4

    I guess that's where the second overload comes in:

    codeReview.SetProperty(review => review.Status, Status.WhatTheElephant);

    It's not fast, pretty, or even remotely sensible, but at least it's strongly typed and the property name is checked by the compiler.


    "These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer

    "These people looked deep within my soul and assigned me a number based on the order in which I joined" - Homer

    D S N 3 Replies Last reply
    0
    • Richard DeemingR Richard Deeming

      I guess that's where the second overload comes in:

      codeReview.SetProperty(review => review.Status, Status.WhatTheElephant);

      It's not fast, pretty, or even remotely sensible, but at least it's strongly typed and the property name is checked by the compiler.


      "These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer

      D Offline
      D Offline
      Duncan Edwards Jones
      wrote on last edited by
      #5

      Yeah - Ironically the non type safe overload shouldn't be public :-)

      1 Reply Last reply
      0
      • S Super Lloyd

        public static class Extensions
        {
        public static void SetProperty(this object domainEntity, string propertyName, object value)
        {
        var t = domainEntity.GetType();
        var p = t.GetProperty(propertyName, System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic);
        p.SetValue(domainEntity, value);
        }
        public static void SetProperty<T, TProp>(this T domainEntity, Expression<Func<T, TProp>> getP, TProp value)
        {
        var e = (MemberExpression)getP.Body;
        SetProperty(domainEntity, e.Member.Name, value);
        }
        }

        This piece of code has a fantastic history that is not obvious... Why is that you might ask? Well.. the single architect of our application decided that we were going to use Domain Driven Design (DDD). He also decided that all domain object property will have private setters. This being, as you can imagine, inconvenient, we got large use of this method (which he also wrote) to set private properties whenever needed! Brilliant! Let's use private property for safety! And let's use this method to ignore private! Genius! :suss: :-\ :-D

        My programming get away... The Blog... DirectX for WinRT/C# since 2013! Taking over the world since 1371!

        P Online
        P Online
        PIEBALDconsult
        wrote on last edited by
        #6

        Dagnabit, I keep hitting upvote, but it only registered once. :sigh: That's right up there with the "Singleton" articles that get posted here that require the target class to have a private constructor and then use Reflection to get it. :doh:

        You'll never get very far if all you do is follow instructions.

        S 1 Reply Last reply
        0
        • S Super Lloyd

          public static class Extensions
          {
          public static void SetProperty(this object domainEntity, string propertyName, object value)
          {
          var t = domainEntity.GetType();
          var p = t.GetProperty(propertyName, System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic);
          p.SetValue(domainEntity, value);
          }
          public static void SetProperty<T, TProp>(this T domainEntity, Expression<Func<T, TProp>> getP, TProp value)
          {
          var e = (MemberExpression)getP.Body;
          SetProperty(domainEntity, e.Member.Name, value);
          }
          }

          This piece of code has a fantastic history that is not obvious... Why is that you might ask? Well.. the single architect of our application decided that we were going to use Domain Driven Design (DDD). He also decided that all domain object property will have private setters. This being, as you can imagine, inconvenient, we got large use of this method (which he also wrote) to set private properties whenever needed! Brilliant! Let's use private property for safety! And let's use this method to ignore private! Genius! :suss: :-\ :-D

          My programming get away... The Blog... DirectX for WinRT/C# since 2013! Taking over the world since 1371!

          B Offline
          B Offline
          Brisingr Aerowing
          wrote on last edited by
          #7

          :doh: :wtf:

          What do you get when you cross a joke with a rhetorical question?

          1 Reply Last reply
          0
          • Richard DeemingR Richard Deeming

            I guess that's where the second overload comes in:

            codeReview.SetProperty(review => review.Status, Status.WhatTheElephant);

            It's not fast, pretty, or even remotely sensible, but at least it's strongly typed and the property name is checked by the compiler.


            "These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer

            S Offline
            S Offline
            Super Lloyd
            wrote on last edited by
            #8

            I created this second overload 2 days ago!! :laugh:

            My programming get away... The Blog... DirectX for WinRT/C# since 2013! Taking over the world since 1371!

            1 Reply Last reply
            0
            • P PIEBALDconsult

              Dagnabit, I keep hitting upvote, but it only registered once. :sigh: That's right up there with the "Singleton" articles that get posted here that require the target class to have a private constructor and then use Reflection to get it. :doh:

              You'll never get very far if all you do is follow instructions.

              S Offline
              S Offline
              Super Lloyd
              wrote on last edited by
              #9

              That's just as bad, indeed!!! :laugh:

              My programming get away... The Blog... DirectX for WinRT/C# since 2013! Taking over the world since 1371!

              1 Reply Last reply
              0
              • Richard DeemingR Richard Deeming

                I guess that's where the second overload comes in:

                codeReview.SetProperty(review => review.Status, Status.WhatTheElephant);

                It's not fast, pretty, or even remotely sensible, but at least it's strongly typed and the property name is checked by the compiler.


                "These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer

                N Offline
                N Offline
                Nicolas Dorier
                wrote on last edited by
                #10

                well, you can't use this line of code outside of review.GetType() class... Status is private ;)

                1 Reply Last reply
                0
                • S Super Lloyd

                  public static class Extensions
                  {
                  public static void SetProperty(this object domainEntity, string propertyName, object value)
                  {
                  var t = domainEntity.GetType();
                  var p = t.GetProperty(propertyName, System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic);
                  p.SetValue(domainEntity, value);
                  }
                  public static void SetProperty<T, TProp>(this T domainEntity, Expression<Func<T, TProp>> getP, TProp value)
                  {
                  var e = (MemberExpression)getP.Body;
                  SetProperty(domainEntity, e.Member.Name, value);
                  }
                  }

                  This piece of code has a fantastic history that is not obvious... Why is that you might ask? Well.. the single architect of our application decided that we were going to use Domain Driven Design (DDD). He also decided that all domain object property will have private setters. This being, as you can imagine, inconvenient, we got large use of this method (which he also wrote) to set private properties whenever needed! Brilliant! Let's use private property for safety! And let's use this method to ignore private! Genius! :suss: :-\ :-D

                  My programming get away... The Blog... DirectX for WinRT/C# since 2013! Taking over the world since 1371!

                  N Offline
                  N Offline
                  Nicolas Dorier
                  wrote on last edited by
                  #11

                  It remind me when I wrote

                  static bool Is(this T obj);

                  with reflection... Then a friend of mind said : WTF have you written that ? instead of "obj is T". The worse of it is that I had no idea why I did something so stupid... wanted to blame somebody else, but the source control history pointed at me. :D

                  S 1 Reply Last reply
                  0
                  • N Nicolas Dorier

                    It remind me when I wrote

                    static bool Is(this T obj);

                    with reflection... Then a friend of mind said : WTF have you written that ? instead of "obj is T". The worse of it is that I had no idea why I did something so stupid... wanted to blame somebody else, but the source control history pointed at me. :D

                    S Offline
                    S Offline
                    Super Lloyd
                    wrote on last edited by
                    #12

                    Did you mean static bool Is<T>(this **object** obj);? Because T obj is... always... T as far as I can tell! :rolleyes: :laugh: Good one anyway! :-D

                    My programming get away... The Blog... DirectX for WinRT/C# since 2013! Taking over the world since 1371!

                    N 1 Reply Last reply
                    0
                    • S Super Lloyd

                      Did you mean static bool Is<T>(this **object** obj);? Because T obj is... always... T as far as I can tell! :rolleyes: :laugh: Good one anyway! :-D

                      My programming get away... The Blog... DirectX for WinRT/C# since 2013! Taking over the world since 1371!

                      N Offline
                      N Offline
                      Nicolas Dorier
                      wrote on last edited by
                      #13

                      yes it was this object good point ;)

                      1 Reply Last reply
                      0
                      • S Super Lloyd

                        public static class Extensions
                        {
                        public static void SetProperty(this object domainEntity, string propertyName, object value)
                        {
                        var t = domainEntity.GetType();
                        var p = t.GetProperty(propertyName, System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic);
                        p.SetValue(domainEntity, value);
                        }
                        public static void SetProperty<T, TProp>(this T domainEntity, Expression<Func<T, TProp>> getP, TProp value)
                        {
                        var e = (MemberExpression)getP.Body;
                        SetProperty(domainEntity, e.Member.Name, value);
                        }
                        }

                        This piece of code has a fantastic history that is not obvious... Why is that you might ask? Well.. the single architect of our application decided that we were going to use Domain Driven Design (DDD). He also decided that all domain object property will have private setters. This being, as you can imagine, inconvenient, we got large use of this method (which he also wrote) to set private properties whenever needed! Brilliant! Let's use private property for safety! And let's use this method to ignore private! Genius! :suss: :-\ :-D

                        My programming get away... The Blog... DirectX for WinRT/C# since 2013! Taking over the world since 1371!

                        T Offline
                        T Offline
                        Tom Clement
                        wrote on last edited by
                        #14

                        I can imagine a use for something like this when implementing Undo/Redo.

                        Tom Clement articles[^]

                        1 Reply Last reply
                        0
                        Reply
                        • Reply as topic
                        Log in to reply
                        • Oldest to Newest
                        • Newest to Oldest
                        • Most Votes


                        • Login

                        • Don't have an account? Register

                        • Login or register to search.
                        • First post
                          Last post
                        0
                        • Categories
                        • Recent
                        • Tags
                        • Popular
                        • World
                        • Users
                        • Groups