Search code examples
c#propertiesdefault

C# Assigning default property for class and operator =


Problem 1:

I have a simple winforms app and I want to DataBind my Person.Name property to a textbox. Name is of type StringField. I originally defined the Name property as String. The data binding works great on value types such as String. I would like the StringField.Value property to be the default property of StringField. I want to see the value of StringField.Value in the textBox rather than the text "FieldApp.StringField".

Problem 2:

I would like to be able to assign a string to a StringField using operator =. This assignment would result in the StringField.Value member being set.

Can this be accomplished?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace FieldApp
{
    public class StringField
    {
        public string Value { get; set; }    
    }

    public class Person
    {

        //private String _Name;
        //public String Name
        //{
        //    get { return _Name; }
        //    set { _Name = value; }
        //}

        //public Person(string name)
        //{
        //    Name = name;
        //}

        private StringField _Name;
        public StringField Name
        {
            get { return _Name; }
            set { _Name = value; }
        }

        public Person(string name)
        {
            Name = new StringField();
            Name.Value = name;
        }
    }

    public partial class FieldAppForm : Form
    {
        Person person = new Person("steve");

        public FieldAppForm()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //our form contains a button1 and textBox1

            //this compiles
            person.Name.Value = "steve";

            //this does not. Is there anyway to accomplish this?
            person.Name = "steve";

            //steve appears in the textbox 
            textBox1.DataBindings.Add("Text", person, "Name.Value");

            //FieldApp.StringField appears in the textbox 
            textBox1.DataBindings.Add("Text", person, "Name");
        }
    }
}

Solution

  • You could create an implicit operator overload. Then you can create StringField from strings like this:

    StringField field = "value of new object";
    string value=(string)field;
    

    Know that this creates a new StringField object. I wouldn't necessarily advice you to do this.

    [System.Diagnostics.DebuggerDisplay("{Value}")]
    public class StringField
    {
        public string Value { get; set; }
        public static implicit operator StringField(string s)
        {
            return new StringField { Value = s };
        }
    
        public static explicit operator string(StringField f)
        {
            return f.Value;
        }
        public override string ToString()
        {
            return Value;
        }
    }