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;
}