Do you have control over the Book and Customer classes?

if so you can add an interface to them and then get each class to implement
it differently:

interface IHaveDisplayName {
  string DisplayName { get; }
}

then you get:

if(e.Value is IHaveDisplayName) e.Value =
((IHaveDisplayName)e.Value).DisplayName
else e.Value = "Unknown"

that requires some nasty type checking though. I assume e.Value is an
object? if you're in .NET 4.0 you could use dynamic to choose a method to
call on a separate object. Like this:

class DisplayNameFactory
{
   public string GetName(object o) { return "Unknown"; }
   public string GetName(Book book) { return book.Title; }
   public string GetName(Customer customer) { return customer.FullName; }
}

then in your handler you have:

e.Value = displayNameFactory.GetName(e.Value as dynamic);

Probably overkill and comes with a bunch of caveats** but it still works.

** For this to work: All of the methods must have the same name and take the
same number of args in the same order (because of the dynamic lookup). You
should have a method that accepts an object so that if the dynamic dispatch
fails you get something meaningful

--
Michael M. Minutillo
Indiscriminate Information Sponge
Blog: http://wolfbyte-net.blogspot.com


On Wed, Oct 27, 2010 at 9:59 AM, Arjang Assadi <[email protected]>wrote:

> I need to do something similar to do this :
>
> if (e.Value  is Book)
>        {
>            e.Value = (e.Value as X).Title;
>
>        }
>        else if (e.Value is Customer)
>        {
>            e.Value = (e.Value as Customer).FullName;
>        }
>        else
>        {
>            e.Value = "Unknown";
>        }
> etc.
>
> in DataGridView_CellFormatting even, but it just looks plain ugly. is
> there way to do this in a more structured manner?
>
> Regards
>
> Arjang
>

Reply via email to