2017-10-15 19 views
1

所以,我有一点问题,我不能完全包裹我的头。因此,我有一个名为Property的基类,并且我有很多从该类派生的类,如IntProperty,ColorProperty等等。现在,我也有一些属于枚举类型的类,目前它们都是单独的类。我想使它成为一个通用的类,但这里有这个问题:在c#中的通用处理#

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

目前,我有一个函数,接受Property作为参数,然后我这样做了,从物业中获得的所有类型:

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

specific_int_function是所有枚举值privided我有相同从通用的T

理想我想这样做(理想跟踪准上下的代码):

(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功能),这些功能

问候, 洛林

+0

你可以传递一个函数给处理程序? –

+0

你可以根本不使用虚拟方法,或者只使用虚拟方法吗?我问的原因是因为我的首选方法会在助手类中使用虚拟方法。 – hvd

+0

只要虚拟类可以在不同的文件中移动,它应该没问题。只是不在基类和派生类中。 – Sanctus2099

回答

0

你可以使用一个函数指针添加到类,和每个构造函数都可以实现它自己的函数?

添加属性Func<void> functionPTR = null

在每一类中,你就会有一个功能,如

void specific_int_function() { 
    //Do Something 
} 

在类的构造函数

functionPTR = specific_int_function; 

然后在泛型类

void GenericHandler() { 
    functionPTR(); 
} 

我不确定语法,但是这应该会为您提供所需的性能。

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

+0

是的,我不能在任何基类或派生类中引用'specific_int_function'。我的问题不在于性能,因为无论采用哪种方法,这都应该是快速的。我更感兴趣的是保持代码干净和灵活。 – Sanctus2099

+0

定义的specific_int_function在哪里?您也可以将其作为参数传递给处理函数。 –

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不允许你有非通用代码 - 通用方法。