简体   繁体   中英

Change “ToString” for a sealed class

I have a class I am working with:

public sealed class WorkItemType

It's ToString is weak (Just shows Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItemType ).

Is there any way to override this to show the name of the WorkItemType ?

Normally I would just aggregate the value in a new class, but I am using this for bindings in WPF (I want to have a list of WorkItemTypes in a combo box and assign the selected value to a bound WorkItemType variable.)

I think I am out of luck here, but I thought I would ask.

A fairly neat way to do it might be to add an extenesion method to the WorkItemType object. Something like this:

public static class ToStringExtension
    {
        public static string MyToString(this WorkItemType w)
        {
           return "Some Stuff"
        }
    }

Then you could call something like

WorkItemType w = new WorkItemType;
Debug.WriteLine(w.MyToString();)

Do you need to override ToString ? If you are in control of the code where the object is displayed, you can always provide a FormatWorkItemType method, or something to that effect.

You're out of luck :-(

You could write your own class that wraps the WorkItemType and delegate down to it (a proxy) expect for the ToString:

class MyWorkItemType
{
  private WorItemType _outer;

  public MyWorkItemType(WorkItemType outer)
  {
    _outer=outer;
  }

  public void DoAction()
  {
    _outer.DoAction();
  }

  // etc

  public override string ToString()
  {
    return "my value"
  }
}

I don't have any C# knowledge, but can't you wrap your extended class inside another class? Proxy all method calls to the extended class, except toString() , Also very hackish, but I thought I'ld bring it up anyway.

WPF provides a few different built-in ways to do this right in the UI. Two I'd recommend:

  • You can use ComboBox's DisplayMemberPath to display a single property value but still select from the WorkItemType objects.
  • If you want to display a composite of a few properties you can change the ComboBox's ItemTemplate to make it look pretty much however you want - formatting text, adding borders, colors, etc. You can even set up the DataTemplate to automatically be applied to any WorkItemType object that gets bound anywhere in your UI (same basic effect from UI perspective as changing ToString) by putting it into Resources and giving it only a DataType with no x:Key.

Doing some sorta magic with reflection is probably your only hope. I know you can instantiate private constructors with it, so maybe you can override a sealed class... Note, this should be your last resort if there is seriously no other way. Using reflection is a very hackish/improper way of doing it.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM