C# Can';无法从扩展类中获得价值,这是为什么?

C# Can';无法从扩展类中获得价值,这是为什么?,c#,unity3d,C#,Unity3d,我试图创建ScriptableObject,同时我试图从继承自其他类的类中访问属性,但由于某种原因,我无法从DamageCard访问属性,即DamageAmount 这是两类: using System.Collections; using System.Collections.Generic; using UnityEngine; public enum CardType { Damage, Healing, Defence, Amplifier} [CreateAssetMen

我试图创建
ScriptableObject
,同时我试图从继承自其他类的类中访问属性,但由于某种原因,我无法从
DamageCard
访问属性,即
DamageAmount

这是两类:

using System.Collections;  
using System.Collections.Generic;   
using UnityEngine;

public enum CardType { Damage, Healing, Defence, Amplifier}

[CreateAssetMenu(fileName = "New Card Item", menuName = "Inventory Syste/Item/Cards")]  
public abstract class CardObjects : ScriptableObject   
{

    public int Id;
    public Sprite icon;

    public CardType type;
    [TextArea(5, 10)]
    public string description;

    //public Sprite artwork;
    public int Energy;
}
扩展
CardObjects
的第二个类:

using System.Collections;
using System.Collections.Generic;    
using UnityEngine;

[CreateAssetMenu(fileName = "New DamageCard Item", menuName = "Inventory Syste/Item/DamageCard")]
public class DamageCard : CardObjects 
{
    
public int DamageAmount;

    public void Awake()
    {
        type = CardType.Damage;
    }
 
}
这就是我的错误所在:

public void OnDrop(PointerEventData eventData)
{
    // CardItem is (DamageCard)

    var item = eventData.pointerDrag.GetComponent<CardItem>(); // CardItem is (DamageCard)
    
    Debug.Log("Dealing "+ item.card.DamageAmount + " Damage");

}

这是一个多态性相关的问题

由于DamageCard继承自CardObjects,因此DamageCard确实是一个CardObject。因此,DamageCard继承了CardObject的数据成员和方法

但是,CardObjects不一定就是损坏卡。它可以是治疗卡或防御卡等。因此,CardObjects实例没有DamageCard的数据成员和方法

由于CardItem包含CardObjects(不是DamageCard),因此您将无法访问DamageAmount数据成员,除非您:

  • 确保CardObject实际上是损坏卡的实例
  • 将CardObject转换为损坏卡
  • 尝试:

    编辑:

    正如萨吉齐夫所建议的,另一种选择是使用
    is
    关键字。
    is
    关键字将执行条件测试并将其转换为损坏卡类型。例如:

     if (item.card is DamageCard thisCard) {
            Debug.Log("Dealing "+ thisCard.DamageAmount + " Damage");
        }
    

    我添加了CardItem…很抱歉不清楚,这是一个大项目,这是唯一一个没有大页面的发布方式,我认为值得一提的是我是一个新发布的人。我认为你应该在第二个代码块中使用
    is
    关键字,而不是
    GetType()
    函数
    public void OnDrop(PointerEventData eventData)
    {
        // CardItem is (DamageCard)
    
        var item = eventData.pointerDrag.GetComponent<CardItem>(); // CardItem is (DamageCard)
        
        if (item.card.type == CardType.Damage) {
            DamageCard thisCard = (DamageCard) item.card; // Cast the CardObjects to a DamageCard
            Debug.Log("Dealing "+ thisCard.DamageAmount + " Damage");
        }
    }
    
    
     if (item.card.GetType() == typeof(DamageCard)) {
            DamageCard thisCard = (DamageCard) item.card; // Cast the CardObjects to a DamageCard
            Debug.Log("Dealing "+ thisCard.DamageAmount + " Damage");
        }
    
     if (item.card is DamageCard thisCard) {
            Debug.Log("Dealing "+ thisCard.DamageAmount + " Damage");
        }