user857521
user857521

Reputation:

Declare variable of different type using If Else-If statement

I have a method which receives events based on which item is clicked within a TreeView.

I can add items to both a TreeView and a TreeViewItem in exactly the same way so have attempted to assign item as either TreeView or TreeViewItem based on the state.sender type. However, currently the only way I can make it work is to assign item as an object first.

private void ProcessEvent(Events.GetEventsResp resp, CustomAsyncStateContainer state)
{
    object item = new object();   //must be a better way than this?
    if (state.sender is TreeViewItem)
        item = (TreeViewItem)state.sender;

    else if (state.sender is TreeView)
        item = (TreeView)state.sender;

     //other code
}

I assume this is called unboxing? Is there a better way to do what I'm attempting?

Edit: Below is the remaining code. I hadn't finished writing it when asking the question and have now realised that object item = new object(); is not going to work in this case.

private void DisplayGetEvent(Events.GetEventsResp resp, CustomAsyncStateContainer state)
{
    object node = new object();
    if (state.sender is TreeViewItem)
        node = (TreeViewItem)state.sender;

    else if (state.sender is TreeView)
        node = (TreeView)state.sender;

    if (resp.eventItems != null)
    {
        Events.UXEvent[] eventItems = resp.eventItems;
        Array.Sort(eventItems, new UXWrapper.UXEventComparer());

        int itemCount = eventItems.Length;
        TreeViewItem tvItem = new TreeViewItem;
        for (int i = 0; i < itemCount; i++)
        {

            tvItem.Header = eventItems[i].name;
            tvItem.Tag = eventItems[i];

            node.Items.Add(tvItem);

        }

    }
}

Upvotes: 2

Views: 1760

Answers (3)

staafl
staafl

Reputation: 3225

I agree with the other commenters that your problem description is insufficient, but if what you want to do is treat TreeView/TreeViewItem polymorphically, you could simply use a variable of type ItemsControl.

if (state.sender is ItemsControl)
    item = (TreeViewItem)state.sender;

else
    throw InvalidArgumentException("state.sender")

Upvotes: 3

user743382
user743382

Reputation:

TreeView and TreeViewItem both derive from ItemsControl, and adding items is done using the methods already available on that, so you should be able to simply use

private void ProcessEvent(Events.GetEventsResp resp, CustomAsyncStateContainer state)
{
    var item = (ItemsControl)state.sender;

    // add to item
}

Upvotes: 5

Steve Wellens
Steve Wellens

Reputation: 20620

Depending on your version of C#, you may be able to use the new dynamic type:
http://msdn.microsoft.com/en-us/library/dd264736.aspx

Upvotes: 4

Related Questions