c#将上置实例返回为它的值;s原版

c#将上置实例返回为它的值;s原版,c#,unity3d,dynamic,C#,Unity3d,Dynamic,我正在尝试将升级后的实例作为一个实例的原始类型返回 public class Card : MonoBehaviour { [SerializeField] private CardInfo cardInfo; public CardInfo Info { get => cardInfo; } } public abstract class CardConsumable : Card { } public class CardDataBase : Mo

我正在尝试将升级后的实例作为一个实例的原始类型返回

public class Card : MonoBehaviour
{
    [SerializeField]
    private CardInfo cardInfo;
    public CardInfo Info { get => cardInfo; }
}

public abstract class CardConsumable : Card
{
}
    

public class CardDataBase : MonoSingleon<CardDataBase>
{
    //list will contain derived class of cards as element
    private List<Card> allCards = new List<Card>(100);
 
    public dynamic GetCard(int id)
    {
        int count = allCards.Count;
        for (int i = 0; i < count;i++)
            if(allCards[i].Info.Id == id)
            {
                var card = allCards[i];
                //tried this but got error
                //var cardType = card.GetType();
                //card = card as cardType;
            }
        return null;          
    }
}

公共类卡:单一行为
{
[序列化字段]
私人卡迪尼奥卡迪尼奥;
公共CardInfo信息{get=>CardInfo;}
}
公共抽象类:Card
{
}
公共类CardDataBase:MonoSingleon
{
//列表将包含派生的卡片类作为元素
私有列表所有卡=新列表(100);
公共动态GetCard(内部id)
{
int count=所有卡片。计数;
for(int i=0;i

例如,在GetCard()中,如果id与参数相同且其原始类型为CardConsumble的元素,则我希望将其返回为CardConsumble而不是Card。简言之,我想返回实例,因为它是原始类型而不是上置类型

GetCard方法可以返回“Card”(非动态)

然后可以对结果使用GetType()或IsAssignableFrom()来获取派生类型并根据需要强制转换它


由于数据库中存储的所有卡都是
Card
类型,因此可以将
GetCard
方法编写为

public Card GetCard(int-id)=>allCards.SingleOrDefault(x=>x.Info.id==id);
然后在返回的卡上调用
GetType()
,以获取具体类型。

使用泛型 除此之外,您还可以使用和提供所需的类型,并使用like仅返回该类型的实例

只需要匹配
id
,但可以返回从
卡派生的任何类型


在调用端强制转换为目标类型 如果你真的想让它动态运行,你也可以这样做

public Card GetCard<(int id, Type type)
{
   return allCards.SingleOrDefault(x => (x.GetType().IsSubclassOf(type) || x.GetType() == type) && x.Info.Id == id);
}

呼叫端的类型检查 或者就像上面说的,每次你得到一张像这样的卡片时,你都需要进行类型检查

public Card GetCard(int id) => allCards.SingleOrDefault(x => x.Info.Id == id);
然后做,例如

var card = cardConsumable = cardDatabase.GetCard(id);

switch(card)
{
    case CardConsumable cardConsumable:
        // Do CardConsumable specific stuff
        cardConsumable.Consume();
        break;

    case SomeOtherCardType someOtherCard:
        // Do SomeOtherCardType specific stuff
        someOtherCard.SomeThing();
        break;

    default:
        // do default stuff for the rest of Card types
        break;
}

你到底想做什么?到底出了什么问题?从if块中返回
实例将为您提供最初存储在列表中的类型的实例。您的用例具体是什么样的?无论哪种方式,您都必须在某个时候检查类型。。如果该方法有时返回
Card
,有时返回
cardcommusible
,对您有什么帮助?->然后,使用您的方法的所有内容都需要再次检查它是
还是
卡消费品
,以便对其调用某些方法……我想我误解了使用dynamic关键字。我只想将实例包含为卡片,以收集唯一列表中的所有派生类,然后将其作为其出生类型返回
public Card GetCard<(int id, Type type)
{
   return allCards.SingleOrDefault(x => (x.GetType().IsSubclassOf(type) || x.GetType() == type) && x.Info.Id == id);
}
var possiblyDynamicType = typeof (CardConsumable);
CardConsumable cardConsumable = (CardConsumable) cardDatabase.GetCard(id, typeof(possiblyDynamicType));
public Card GetCard(int id) => allCards.SingleOrDefault(x => x.Info.Id == id);
var card = cardConsumable = cardDatabase.GetCard(id);

switch(card)
{
    case CardConsumable cardConsumable:
        // Do CardConsumable specific stuff
        cardConsumable.Consume();
        break;

    case SomeOtherCardType someOtherCard:
        // Do SomeOtherCardType specific stuff
        someOtherCard.SomeThing();
        break;

    default:
        // do default stuff for the rest of Card types
        break;
}