【问题标题】:How to cast different types in a method of a derived class?如何在派生类的方法中转换不同的类型?
【发布时间】:2019-09-13 01:40:29
【问题描述】:

我有一个基类BaseCollectionInspector,它有两个派生类:ReactionCollectionInspectorConditionCollectionInspector

基类有这个方法:

protected override void AddItem(object obj) {
    AssetInfo assetInfo = (AssetInfo) obj;
    string assetName = Path.GetFileNameWithoutExtension(assetInfo.assetPath);
    var assetType = Type.GetType(typeof(BaseReaction).Namespace + "." + assetName + ", Assembly-CSharp");
    var newItem = (BaseReaction) collection.gameObject.AddComponent(assetType);
    newItem.showItem = false; // Hide script in inspector
    int index = collectionList.serializedProperty.arraySize++;

    collectionList.serializedProperty.GetArrayElementAtIndex(index).objectReferenceValue = newItem;
    serializedObject.ApplyModifiedProperties();
}

这两种派生类型之间的区别在于,一种拥有BaseReaction 的列表,而另一种拥有BaseCondition 的列表,两者都拥有showItem 属性。

他们都将使用完全相同的AddItem 方法,除了assetTypenewItem 的强制转换。

我正在尝试正确学习 C#,并希望使用 DRY 原则,即使只是复制代码很容易。我想我可能可以使用接口,但我不确定如何设置它,因为我希望该方法仅在基类中,以适应正确的子类。

我也尝试在每个派生类中放置类似的东西,但我找不到在基类方法中使用它的方法:

private Type itemType = typeof(BaseReaction);

提前谢谢你!

【问题讨论】:

  • AddItem(object obj)很少 好主意...很难说没有使用示例会更好,但请考虑简单的强类型单独方法或通用方法是否可行。
  • 这是一个 Unity 编辑器类,其名称类似于 `dropdownMenu.AddItem(new GUIContent(menuPath), false, AddItem, new AssetInfo {assetPath = path});` 并且 AddItem 发送您点击的任何内容on(可以是任何类型)作为参数。所以我真的无法改变这一点。
  • stackoverflow.com/questions/298976/… 也许你在找什么...
  • 谢谢,我注意到派生类还有其他类似的问题,所以我可能不得不将它们分开,就像两者都有一个名为 collection 的列表,但一个是 ReactionCollection 类型,另一个是是ConditionCollection。我似乎无法将它们转换为子类,而基类仍然知道它们中存在哪些属性。 ://

标签: c# interface casting dry derived-class


【解决方案1】:

对我来说效果很好的解决方案是:

  • 创建一个基类CollectionItemBaseReactionBaseCondition 都从该基类派生,具有相似的所有属性
  • 创建一个基类BaseCollectionReactionCollectionConditionCollection 都从该基类派生,具有相似的所有属性

这样我可以只在BaseCollectionInspector 中引用基类CollectionItemBaseCollection,并将我希望派生检查器唯一的所有方法设置为abstract

我确信这对我正在使用的内容非常具体,但重点是它是可能的,你只需要找到类似类的公共部分,并为其创建一个父类。

在这里感谢您的帮助:)

PS:我真的很喜欢 C#,并且意识到 PHP 在没有任何严格类型的情况下工作是多么令人困惑,即使我已经在其中工作了 20 年左右 :)

【讨论】:

    猜你喜欢
    • 2010-09-12
    • 2022-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多