简体   繁体   English

使用If Else-If语句声明不同类型的变量

[英]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. 我有一个方法,根据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. 我可以以完全相同的方式向TreeView和TreeViewItem添加项目,因此尝试根据state.sender类型将item分配为TreeView或TreeViewItem。 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(); 在提出问题时我还没有写完它,现在已经意识到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);

        }

    }
}

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 TreeViewTreeViewItem都派生自ItemsControl ,并且使用已有的方法添加项目,因此您应该能够简单地使用

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

    // add to item
}

Depending on your version of C#, you may be able to use the new dynamic type: 根据您的C#版本,您可以使用新的动态类型:
http://msdn.microsoft.com/en-us/library/dd264736.aspx http://msdn.microsoft.com/en-us/library/dd264736.aspx

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. 我同意其他评论者认为你的问题描述不充分,但如果你想要做的是多态地处理TreeView / TreeViewItem,你可以简单地使用ItemsControl类型的变量。

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

else
    throw InvalidArgumentException("state.sender")

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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