c#中的通用处理

时间:2017-10-15 14:37:13

标签: c# templates generics

所以,我有一个问题,我无法完全解决这个问题。

所以,我有一个名为Property的基类,我有很多类派生自那个类,如IntPropertyColorProperty等等。现在,我也有一些属于枚举类型,目前它们都是单独的类。我想把它变成一个普通类,但问题就在这里:

在代码的不同部分,我需要处理所有这些代码。请记住,我不能使用虚拟功能(我正在使用UnityEditor进行操作)。

目前,我有一个函数,它以Property为参数,然后对从属性派生的所有类型执行此操作:

if(property is IntProperty)
{
       IntProperty intProperty = property as IntProperty;
       intProperty.theValue = specific_int_function();
}

specific_int_function对于我所拥有的T所有enum值都是相同的。

理想情况下,我想做这样的事情(伪代码):

(using T)
{
   if(property is EnumProperty<T>)
   {
      EnumProperty<T> enumProperty = property as EnumProperty<T>;
      enumProperty.value = (T)my_enum_value_function(typeof(T));
   }
}

有关如何使所有这些代码更好的想法吗?

希望我提供了所有相关信息。

编辑:

并不是说我不能在这些类中使用虚函数,但我不能调用该特定文件中的任何特定函数。我有2个编译组,只有一个可以访问这些函数(EditorGUI函数适用于那些知道我在说什么的人)

此致 洛林

2 个答案:

答案 0 :(得分:1)

  

请记住,我不能使用虚拟功能(我正在使用UnityEditor进行操作)。

这真的是你应该做的。如果你不能,那就没问题了,但为了其他人的利益,我在这里留下这个笔记也会读到这个问题并回答。

根据我的经验,实现这一目标的最困难的方法是使用辅助类,因为它可以避免在使用通用辅助方法时必须处理的一些反射复杂性。

abstract class EnumPropertyHelper {
  public abstract void DoSomething(Property property);
}
class EnumPropertyHelper<T> : EnumPropertyHelper {
  public override void DoSomething(Property property) {
    EnumProperty<T> enumProperty = property as EnumProperty<T>;
    enumProperty.value = (T)my_enum_value_function(typeof(T));
  }
}

然后,

if (property.GetType().IsGenericType
    && property.GetType().GetGenericTypeDefinition() == typeof(EnumProperty<>)) {
  var helperType = typeof(EnumPropertyHelper<>).MakeGenericType(property.GetType().GetGenericTypeArguments());
  var helper = (EnumPropertyHelper)Activator.CreateInstance(helper);
  helper.DoSomething(property);
}

但是你确实需要跳过类似于这个的箍,无论你最终做什么,因为C#和.NET不允许你在非泛型方法中使用通用代码。

答案 1 :(得分:0)

您可以使用向该类添加一个函数指针,并且每个构造函数都可以实现它自己的函数吗?

添加属性Func<void> functionPTR = null

在每个课程中,您都有

等功能
void specific_int_function() {
  //Do Something
}

在类构造函数中

functionPTR = specific_int_function;

然后在泛型类

void GenericHandler() {
  functionPTR();
}

我不确定语法,但这应该会为您提供您想要的表现。

阅读函数指针,了解如何定义返回值和函数参数。