【问题标题】:Checking if an object is an instance of an Interface检查对象是否是接口的实例
【发布时间】:2014-08-16 07:08:21
【问题描述】:

我有一个名为MeleeWeapon 的类,它继承自类Item 和接口Usable。我有一个 Item 类型的数组,其中包含一些 MeleeWeapon 类型的对象,我想知道如何检查它们是否可用。我尝试了以下方法,但都导致错误被记录。有什么建议吗? (此索引中的项目是武器类型,我已经确定了这一点) 我已经搜索了这个答案,这是我得到这些方法的地方,所以我为重复道歉,它对我不起作用。

Debug.Log ( itemType.IsAssignableFrom(typeof(Usable))); 
Debug.Log (inv.items[inv.selectedHotbarSlot].item is Usable);

【问题讨论】:

  • 澄清“不适合我”。 “可用”正是您要寻找的。​​span>
  • 我正在尝试获取一个布尔值 true,但结果却是 false。
  • 然后去调试你的代码。您没有提供足以证明问题的示例,因此您不能期待任何更好的答案。

标签: c# interface unity3d


【解决方案1】:

您可能正在寻找这个:

if (obj.IsInstanceOfType(Usable))

【讨论】:

  • 这基本上就是我在帖子底部作为示例放置的内容,除了在 if 语句中而不是在日志中。当它应该是真的时,我得到了错误。
  • @donsavage:- 你可以试试:- if (obj.IsInstanceOfType(service))
  • @R.T.我可能弄错了,但这在 Unity3D 中无法编译。
【解决方案2】:

这是我检查对象是否属于某种类型的方式。

public interface A 
{
}

public class B : MonoBehaviour, A 
{
    void Start () 
    {
        Debug.Log(this is A); // Will print True.
    }
}

记住this在这种情况下是脚本B的实例。

你可以把它写在if里面

if(obj is A)
// Do something.

【讨论】:

    【解决方案3】:

    您似乎在向后使用 IsAssignableFrom(这是一个相当常见的错误)。

    IsAssignableFrom 将返回 true,如果以下将“工作”(假设 MyItemType 扩展可用):

    Usable usable = new Usable(); //Pretend this constructor exists
    MyItemType itemType = usable;
    

    换句话说,它正在检查MyItemType 类型的对象是否可以Usable 类型的对象中赋值。

    看来您要测试的是,这是否可行:

    MyItemType itemType = new MyItemType();
    Usable usable = itemType;
    

    为此,请切换类型的位置:

    Debug.Log(typeof(Usable).IsAssignableFrom(itemType));

    【讨论】:

      猜你喜欢
      • 2021-11-20
      • 1970-01-01
      • 1970-01-01
      • 2012-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多