Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用If-Else-If语句声明不同类型的变量_C#_Types_Casting - Fatal编程技术网

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

C# 使用If-Else-If语句声明不同类型的变量,c#,types,casting,C#,Types,Casting,我有一个方法,它根据在树视图中单击的项目接收事件 我可以以完全相同的方式将项目添加到TreeView和TreeView项目中,因此我尝试根据状态将项目分配为TreeView或TreeView项目。发件人类型。但是,目前我唯一能让它工作的方法是首先将项指定为对象 private void ProcessEvent(Events.GetEventsResp resp, CustomAsyncStateContainer state) { object item = new object();

我有一个方法,它根据在树视图中单击的项目接收事件

我可以以完全相同的方式将项目添加到TreeView和TreeView项目中,因此我尝试根据状态将
项目
分配为TreeView或TreeView项目。发件人类型。但是,目前我唯一能让它工作的方法是首先将项指定为对象

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
}
我想这叫做拆箱?有没有更好的方法来做我正在尝试的事情

编辑:下面是剩余的代码。问这个问题时我还没有写完,现在我意识到
objectitem=newobject()在这种情况下不起作用

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);

        }

    }
}
private void DisplayGetEvent(Events.GetEventsResp,CustomAsyncStateContainer状态)
{
对象节点=新对象();
if(state.sender是TreeViewItem)
节点=(TreeViewItem)state.sender;
else if(state.sender是TreeView)
node=(TreeView)state.sender;
if(resp.eventItems!=null)
{
Events.UXEvent[]eventItems=resp.eventItems;
Sort(eventItems,new-UXWrapper.UXEventComparer());
int itemCount=eventItems.Length;
TreeViewItem tvItem=新的TreeViewItem;
对于(int i=0;i
根据您的C#版本,您可能可以使用新的动态类型:

TreeView
treevieItem
都源自
ItemsControl
,添加项是使用该控件上已有的方法完成的,因此您应该能够简单地使用

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

    // add to item
}

我同意其他评论者的观点,即您的问题描述是不够的,但是如果您想以多态方式处理TreeView/TreeView项目,您可以简单地使用ItemsControl类型的变量

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

else
    throw InvalidArgumentException("state.sender")

你能把代码全部贴出来吗?我需要理解为什么您需要像这样分配变量。您可以直接将
item
分配给
null
。无需创建新的ObjectUnbox正在将装箱值类型转换为未装箱值。由于
TreeView
TreeViewItem
是引用类型,因此这不是取消装箱。此外,您的强制转换和类型检查是多余的,因为该项仍然被键入为
对象
。如果没有看到代码的其余部分,就不可能说出最好的方法是什么。我认为var更糟糕。它甚至被有经验(但懒惰)的程序员滥用。