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