gpt4 book ai didi

c# - 如何使 .Net 泛型方法对值类型和引用类型表现不同?

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

我有两种方法的实现,一种用于值类型,另一种用于引用类型:

public static Result<T> ImplRef(T arg) where T : class {...}
public static Result<T> ImplVal(T arg) where T : struct {...}

我想写一个像这样调用正确实现的方法

public static Result<T> Generic(T arg) {
if (typeOf(T).IsValueType)
return ImplVal(arg);
else
return ImplRef(arg);
}

显然,上面的实现无法编译。我怎样才能以最少的思考做到这一点?

最佳答案

泛型的想法通常是用给定的任何输入执行相同的逻辑,尽管显然你需要实用。就我个人而言,我可能会使用两种不同的方法,而不是将它们强加到同一个方法中,但这会使只知道 T 的通用方法调用变得困难。没有办法从静态代码中满足 : class/: struct,虽然 MakeGenericMethod 方法可能有效,但将是一个顺序幅度较慢。

    // slow; use with caution
public static Result<T> Generic<T>(T arg) {
if (typeof(T).IsValueType)
return (Result<T>)typeof(Program).GetMethod("ImplVal")
.MakeGenericMethod(typeof(T))
.Invoke(null, new object[] {arg});
else
return (Result<T>)typeof(Program).GetMethod("ImplRef")
.MakeGenericMethod(typeof(T))
.Invoke(null, new object[] { arg });
}

(用托管方法的类型替换 typeof(Program))

另一种方法(如 Jon 所说)是将(类型化的)委托(delegate)缓存到方法中:

public static Result<T> Generic<T>(T arg) {
return Cache<T>.CachedDelegate(arg);
}

internal static class Cache<T>
{
public static readonly Func<T, Result<T>> CachedDelegate;
static Cache()
{
MethodInfo method;
if (typeof(T).IsValueType)
method = typeof(Program).GetMethod("ImplVal")
.MakeGenericMethod(typeof(T));
else
method = typeof(Program).GetMethod("ImplRef")
.MakeGenericMethod(typeof(T));
CachedDelegate = (Func<T, Result<T>>)Delegate.CreateDelegate(
typeof(Func<T, Result<T>>), method);
}
}

更多工作,但会很快。静态构造函数(或者您可以使用属性/空检查)确保我们只做一次艰苦的工作。

关于c# - 如何使 .Net 泛型方法对值类型和引用类型表现不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/388718/

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