C#:如何使用带有“的泛型方法”;“出去”;变量

C#:如何使用带有“的泛型方法”;“出去”;变量,c#,generics,out-parameters,generic-method,C#,Generics,Out Parameters,Generic Method,我想创建一个简单的泛型函数 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); } void赋值(out T结果)

我想创建一个简单的泛型函数

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);
}
void赋值(out T结果)
{
类型=类型(T);
如果(type.Name==“String”)
{
//result=“你好”;
}
else if(type.Name==“Int32”)
{
//结果=100;
} 
否则结果=默认值(T);
}
用法:

int value;
string text;

Assign(value); // <<< should set value to 100
Assign(text); // <<< should set text to "hello"
int值;
字符串文本;

分配(值);// 看起来在这种情况下,你这么做是为了避免拳击?没有更多信息很难说,但对于这个特定的示例,只使用方法重载会更容易,而且可能不太容易出现错误:

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

void Assign(out int value)
{
   //...
}
为了明确了解此处的错误,在将对象强制转换为泛型类型之前,确实需要将值强制转换为对象:

(T)(object)"hello world!";
哪个IMO很糟糕,应该是最后的手段——当然不会让你的代码更干净

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

这里有一种方法:

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);
    }
}
静态无效分配(out T结果){
类型=类型(T);
如果(type.Name==“String”){
结果=(T)Convert.ChangeType(“hello”,typeof(T));
}
else if(type.Name==“Int32”){
结果=(T)Convert.ChangeType(100,typeof(T));
}
否则{
结果=默认值(T);
}
}

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

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

下面的代码可以工作,但正如我所说的那样,用这种方式编写代码是个坏主意

    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); 
    }
public T GetObject(string val)
{
T_object=默认值(T);
_object=(T)Convert.ChangeType(val,typeof(T));
返回_对象;
}

非常感谢;这很有效。我使用泛型方法的原因是为了简化代码。因为“分配代码”仅用于特定类型(例如字符串);为所有可能的类型创建重载函数是不好的。result=default(T)//是常见的行为或不同意您的意见。我认为超载就是为了这个。仅在需要时使用泛型。
        int value;
        string text;

        Assign(out value);
        Assign(out text);
public T GetObject<T>(string val)
{
    T _object = default(T);
    _object = (T)Convert.ChangeType(val, typeof(T));
    return _object;
}