2

我正在从一个Entity对象返回值。其中有些是String打字的,有些不是。现在,我做了一个快速的解决方案,如下所示。

private String GetStringValue(Entity entity, String attribute, String substitute = "")
{
  if(entity.Contains(attribute)
    return entity[attribute] as String;
  return substitute;
}

private String GetIntValue(Entity entity, String attribute, int substitute = 0)
{
  if(entity.Contains(attribute)
    return entity[attribute] as int;
  return substitute;
}

然后我记得有一个通用类型的语法(类似于<TypeX>)。但是,我的问题是,是否有必要开始更改现有代码。我需要在两个地方(返回类型和替代类型)更改方法的签名,但我担心我还需要在方法内部进行一些复杂的编码。

另一方面,我有一个很好的方法来处理所有可能的类型(我有一种预感,我们将使用的不仅仅是字符串和整数。

4

6 回答 6

2

您将不得不在三个地方更改方法的签名,因为您还必须添加泛型参数:

private T GetValue<T>(Entity entity, String attribute, T substitute)

该方法中,实际上不需要任何复杂的编码;将当前出现的stringorint分别替换为 ,T就足够了。(请注意,as只有在限制为引用类型时才能应用运算符T- 您可能不想这样做,因为int它是一种值类型)。

请注意,此方法存在两个您可能会认为缺点的问题:

  • 这种通用方法将支持“所有可能的类型”,但它也将支持任何不可能的类型(用户可以自由指定他们喜欢的任何类型,并且在仍然支持和的同时T没有办法限制。Tstringint
  • 您不能为每种类型指定任意默认替代值。您可以做的是为 声明一个默认值substitute,即default(T),但至少为string,这不是一个空字符串,而是null
于 2013-02-08T08:30:31.740 回答
1

如果您不想更改方法签名,您可以编写一个泛型函数并从所有这些非泛型版本中调用它。

private String GetStringValue(...){
    return GetValue<String>(...);
}

顺便说一句,您正在寻找通用方法

例如(来自 msdn)

static void Swap<T>(ref T lhs, ref T rhs)
{
    T temp;
    temp = lhs;
    lhs = rhs;
    rhs = temp;
}

...

Swap<int>(ref a, ref b);

要不就

Swap(ref a, ref b); //type int is infered based on type of arguements and method signature
于 2013-02-08T08:27:51.150 回答
1

你是对的“类似”是通用方法。在那里查看通用方法。 下一个方法看起来很适合您的目的。

   private  static T GetValue<T>(Entity entity, string attribute, T defaultValue)
        {
            if (!entity.Contains(attribute))
                return defaultValue;

            return  (T)entity[attribute];
        }

编辑:根据 w0lf 的评论更新。

于 2013-02-08T08:29:10.490 回答
1

什么课Entity?假设它是一个自定义类,让它也通用,那么它的工作原理:

private T Get<T>(Entity<T> entity, T attribute, T substitute = default(T))
{
    if (entity.Contains(attribute))
        return entity[attribute];
    return substitute;
}

您可以通过这种方式检索值:

var entity = new Entity<string>();
string val = Get<string>(entity, "attr", "subst");
于 2013-02-08T08:33:31.367 回答
0

你应该定义你的Entity<T>类:

public class Entity<T>
{
    // TODO: implement
    public T this[string i] { get; set; }

    // TODO: implement
    internal bool Contains(string attribute)
    {
        return true;
    }
    // TODO: implement
    // other properties and methods       
}

您可以使用通用方法:

private T GetStringValue<T>(Entity<T> entity, String attribute, T substitute = default(T))
{
    if (entity.Contains(attribute))
        return entity[attribute];
    return substitute;
}
于 2013-02-08T08:40:07.810 回答
0

如果可以在方法中概括代码,我绝对建议以通用方式使用它。它使类更小,可读性更好,如果需求发生变化,您只需更改一种方法。您的方法看起来可以轻松通用。

private T GetIntValue<T>(Entity entity, String attribute, T substitute = default(T))
{
    if(entity.Contains(attribute))
        return (T)entity[attribute];
    return substitute;
}

如果要执行更多逻辑,您还可以使用具有不同类型函数的字典:

private IDictionary<Type, Func<Entity, string, object>> actions;

private void InitActions()
{
    actions = new Dictionary<Type, Func<Entity, string, object>>
        {
            {
                typeof (string), (entity, attribute) =>
                    {
                        // this could be your custom code for string
                        return entity[attribute];
                    }
            },
            {
                typeof (int), (entity, attribute) =>
                    {
                        // this could be your custom code for int
                        return entity[attribute];
                    }
            }
        };
}

private T GetIntValue<T>(Entity entity, String attribute, T substitute = default(T))
{
    if (entity.Contains(attribute) && actions.ContainsKey(typeof (T)))
    {
        Func<Entity, string, object> action = actions[typeof (T)];
        return (T)action(entity, attribute);
    }
    return substitute;
}
于 2013-02-08T08:41:50.813 回答