gpt4 book ai didi

c# - 如何定义通用扩展方法

转载 作者:太空狗 更新时间:2023-10-29 17:52:05 25 4
gpt4 key购买 nike

我正在尝试定义一个扩展方法,该方法可以返回由调用定义的类型的对象。

所需用途: Cat acat = guy.GiveMeYourPet<Cat>();

尝试实现

我可以毫不费力地定义这样的通用方法:

public static T GiveMeYourPet<T>(Person a) { ... }

Cat acat = GiveMeYourPet<Cat>(guy);

或像这样的扩展方法:

public static Cat GiveMeYourPetCat<P>(this P self) where P : Person, ... { ... }

Cat acat = guy.GiveMeYourPetCat();

但是当我尝试做我真正想做的事情时:

public static T GiveMeYourPet<T, P>(this P self) where P : Person, ... { ... }

Cat acat = guy.GiveMeYourPet<Cat>();

编译器期望 GiveMeYourPet() 接收 2 个类型参数(即使通过调用对象 guy 上的扩展方法隐式提供了一个。

我该怎么做才能使这项工作成功?

请注意,我也尝试过颠倒参数定义的顺序,但没有任何改变:

public static T GiveMeYourPet<P, T>(this P self)

以下调用也不起作用,因为您不能在类型说明中调用方法:

Cat acat = guy.GiveMeYourPet<guy.GetType(), Cat>();

最佳答案

C# 编译器类型推断并不像您希望的那样复杂。您必须在这种方法中明确指定这两种类型:

void Main()
{
int i = 0;
bool b = i.GiveMeYourPet<bool, int>();
}

public static class MyExtensions
{
public static T GiveMeYourPet<T, P>(this P self)
{
return default(T);
}
}

如果您想避免明确指定两者(我不会责怪您),您可以尝试将您的方法更改为:

public static T GiveMeYourPet<T>(this IPetOwner self)

(有了这个接口(interface),你甚至不需要知道真正的类型是什么;如果你知道,使用 asis)或者甚至:

public static T GiveMeYourPet<T>(this object self)

(并使用asis)

如果这不是一个选项,并且 guy 的真实类型(在您的示例中)不是静态已知的(例如,您只是将他作为一个 object),您'可能必须使用反射,例如:

MethodInfo method = typeof(MyExtensions).GetMethod("GiveMeYourPet");
MethodInfo generic = method.MakeGenericMethod(typeof(Pet), guy.GetType());
generic.Invoke(guy, null);

关于c# - 如何定义通用扩展方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17664794/

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