【发布时间】:2019-09-13 01:40:29
【问题描述】:
我有一个基类BaseCollectionInspector,它有两个派生类:ReactionCollectionInspector 和ConditionCollectionInspector。
基类有这个方法:
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 方法,除了assetType 和newItem 的强制转换。
我正在尝试正确学习 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