8

我想创建一个简单的通用函数

void Assign<T>(out T result) 
{
  Type type = typeof(T);
  if (type.Name == "String")
  {
     // result = "hello";
  }
  else if (type.Name == "Int32")
  {
     // result = 100;
  } 
  else result = default(T);
}

用法:

int value;
string text;

Assign(value); // <<< should set value to 100
Assign(text); // <<< should set text to "hello"

我的问题是你如何编写代码来设置这些值,即。评论部分缺少的代码。

谢谢你的帮助。

4

4 回答 4

16

看起来在这种情况下,也许您这样做是为了避免拳击?没有更多信息很难说,但对于这个特定的例子,只使用方法重载会容易得多,而且可能不太容易出错:

void Assign(out string value)
{
   //...
}

void Assign(out int value)
{
   //...
}

为了具体了解这里出了什么问题,您确实需要先将一个值转换为对象,然后再将其转换为泛型类型:

(T)(object)"hello world!";

哪个 IMO 非常讨厌,应该是最后的手段——当然不会让你的代码更干净。

每当您对泛型参数进行类型检查时,这很好地表明泛型不是解决您问题的正确方法。进行泛型参数类型检查会使您的代码更复杂,而不是更简单。它使一个方法根据类型负责不同的行为,而不是一系列易于更改而不会意外影响其他方法的单一方法。请参阅单一职责原则

于 2009-11-14T22:02:39.117 回答
3

首先,这是一个非常糟糕的模式。你不应该使用这种模式。也许如果你描述你真正想要达到的目标,会有更好的答案。

下面的代码有效,但正如我所说,以这种方式编写代码是一个坏主意。

    void Assign<T>(out T result) 
    { 
        Type type = typeof(T); 
        if (type.Name == "String") 
        { result = (T) ((object)"hello"); } 
        else if (type.Name == "Int32") 
        { result = (T) ((object)100); } 
        else result = default(T); 
    }

和用法:

        int value;
        string text;

        Assign(out value);
        Assign(out text);
于 2009-11-14T22:10:03.870 回答
1
public T GetObject<T>(string val)
{
    T _object = default(T);
    _object = (T)Convert.ChangeType(val, typeof(T));
    return _object;
}
于 2011-09-07T07:28:54.587 回答
0

这是一种方法:

static void Assign<T>(out T result) { 
    Type type = typeof(T);
    if (type.Name == "String") {
        result = (T)Convert.ChangeType("hello", typeof(T));
    }
    else if (type.Name == "Int32") {
        result = (T)Convert.ChangeType(100, typeof(T));
    }
    else {
        result = default(T);
    }
}

但是这段代码闻起来真的很糟糕,并且违背了泛型的观点(而是使用重载方法)。我希望这不会出现在某个地方的生产代码中,而仅仅是为了启发。

于 2009-11-14T22:03:44.863 回答