2014-04-11 78 views
0

我是C#的新手,但我来自C++背景。重构C#代码

这三个函数是否可以重构为带模板的单个函数? 请注意,这三个函数不在通用类中。

private void CheckValue(bool temp, ref bool variable) 
    { 
     if (temp != variable) 
     { 
      variable = temp; 
      EditorUtility.SetDirty(target); 
     } 
    } 

    private void CheckValue(float temp, ref float variable) 
    { 
     if (temp != variable) 
     { 
      variable = temp; 
      EditorUtility.SetDirty(target); 
     } 
    } 

    private void CheckValue(int temp, ref int variable) 
    { 
     if (temp != variable) 
     { 
      variable = temp; 
      EditorUtility.SetDirty(target); 
     } 
    } 
+0

难道是不是* *无效,有人提供了两种类型相似这三种类型之一? – Servy

+0

@Servy它只是一个Unity对象。 – Andre

+0

另请注意C#没有模板。它有不同的泛型。 – Servy

回答

0

基于这个问题,似乎所有的代码做的是验证变量,并将它与一些暂时的价值,如果它是不同的分配临时的变量。

我在我的commonlib中有一个助手类,它有一个函数将验证传递的值的正确类型,并返回所需类型的值或将所需类型的默认值返回给调用者。

所以,你可以参照如下内容加入到该项目,并使用调用诸如:

var variable = Helper.Validate<put your type here>(temp); 

OR

var tmp = Helper.Validate<put your type here>(temp); 
var variable = !variable.Equal(tmp) ? tmp : variable 
EditorUtility.SetDirty(target); 


using System.ComponentModel; 
namespace CommonLib.Helpers 
{ 
public static partial class Helper 
{ 
    public static T Validate<T>(object param) 
    { 
     return TryParse<T>(param); 
    } 

     private static T TryParse<T>(object inValue) 
     { 
      var converter = TypeDescriptor.GetConverter(typeof(T)); 

      try 
      { 
       return (T)converter.ConvertFromString(inValue.ToString().Trim()); 
      } 
      catch 
      { 
       return default(T); 
      } 
     } 
} 
} 
0

如何使用泛型?

private void CheckValue<T>(T temp, ref T variable) 
{ 
    if (temp != variable) 
    { 
     variable = temp; 
     EditorUtility.SetDirty(target); 
    } 
} 
+0

现在可以使用多于这三种类型来调用该方法。这可能无效。 – Servy

+0

@AmmarCSE这个类不是一个泛型类,它只是一个普通的类,它具有这三个函数。 – Andre

+2

另外,不能对泛型类型使用'!='运算符。可能必须用'if(!EqualityComparer .Default.Equals(temp,variable))' –

-2

您可以使用泛型类型,但是你需要的“其中T:类”末,以获得比较编译,因为类型T不一定是引用类型...

private static void CheckValue<T>(T temp, ref T variable) where T : class 
    { 
     if (temp != variable) 
     { 
      variable = temp; 
      EditorUtility.SetDirty(target); 
     } 
    } 
+1

由于类限制,现在这三种类型的任何一种都可以用于此方法。 – Servy

+0

啊 - 好点。 – randeroo

0

没有针对此不支持,至少directly.You 不能指定类型应该是boolfloatint可以使用struct约束做.The最近的事情然后执行type-check,如果该类型不是其中之一受支持的类型会引发异常。

下面是一个例子:

private static void CheckValue<T>(T temp, T variable) where T : struct 
{ 
    if (!new[] {typeof (bool), typeof (float), typeof (int)}.Contains(typeof (T))) 
    { 
      // invalid type 
    } 
    if (temp.Equals(variable)) 
    { 
     EditorUtility.SetDirty(target);  
    } 
} 
+0

当然,你现在已经失去了所有编译时的类型安全性,所以你最好使用OP的代码。 – Servy

+0

@Servy是的,如果我们可以指定一个约束,比如'where T:int,float,bool': –