gpt4 book ai didi

c# - 通用类型参数和动态类型

转载 作者:行者123 更新时间:2023-11-30 21:11:24 24 4
gpt4 key购买 nike

我想知道,在下面的示例中,TrickyGenericMethod 中的 if 语句是个坏主意,还是在某些情况下没问题。在我的例子中,我有一个工厂方法,它使用通用参数来产生正确的结果。不幸的是,如果传入的对象的类型引用是对接口(interface)或抽象类的引用,它将产生不正确的结果,因为 T 不是对象的实际类型。

class Program
{
static void Main(string[] args)
{
HasGenericMethod hgm = new HasGenericMethod();
Console.WriteLine(hgm.GenericMehtod("string"));
Console.WriteLine(hgm.GenericMehtod((object)"object"));

Console.WriteLine();

Console.WriteLine(hgm.TrickyGenericMethod("string"));
Console.WriteLine(hgm.TrickyGenericMethod((object)"object"));


Console.ReadKey();
}
}

class HasGenericMethod
{
public string GenericMehtod<T>(T param)
{
return "Type of T:\t" + typeof(T) + "\tType of param:\t" + param.GetType();
}

public string TrickyGenericMethod<T>(T param)
{
if (typeof(T) != param.GetType())
{
return TrickyGenericMethod((dynamic)param);
}
return "Type of T:\t" + typeof(T) + "\tType of param:\t" + param.GetType(); ;
}
}

最佳答案

is the if statement in TrickyGenericMethod is a bad idea

是的,我觉得很像。特别是,如果您使用内部类型的值从不同的程序集中调用它(并且它通过此路径一次),“执行时编译器”将为 dynamic 使用最佳可访问类型调用...所以你最终会遇到堆栈溢出。

编辑:示例代码...

// Library.cs
using System;

public class Library
{
public static void Foo<T>(T value)
{
Console.WriteLine("{0} : {1}", typeof(T), value.GetType());
if (typeof(T) != value.GetType())
{
dynamic d = value;
Foo(d);
}
}
}

// Test.cs
class Internal {}
class Program
{
static void Main(string[] args)
{
Library.Foo<object>(new Internal());
}
}

结果:

System.Object : Internal
System.Object : Internal
...
System.Object : Internal

Process is terminated due to StackOverflowException.

可能还有其他类似的情况也不太奏效。我会尽量避免依赖 typeof(T) == value.GetType()

您可以无条件地使用动态类型调用私有(private)实现方法,这样您最终只会尝试一次,并以“尽力而为”的方式结束。

关于c# - 通用类型参数和动态类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8084092/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com