gpt4 book ai didi

c# - 根据固定的类型列表多次调用泛型方法

转载 作者:太空狗 更新时间:2023-10-30 01:13:12 26 4
gpt4 key购买 nike

我有一个通用方法 Method<T>()我有一个如下所示的类型列表:

public static readonly Type[] AllPossibleTypes = new Type[]{
typeof(A),
typeof(B),
typeof(C),
typeof(D)
};

我的代码中有多个地方需要 switch case并进行模式匹配,然后最后手动调用每一个,例如Method<A> Method<B> Method<C> ... 然后,当我决定向可能类型列表中添加更多类型时,我将不得不记住修复代码中的许多地方。是否有任何方法可以遍历可能的类型并使其可用于泛型?类型列表在运行时不会改变。

A B C D实现相同的接口(interface)并且没有其他类型实现该接口(interface),如果这能帮助我实现这个目标的话。

public interface IToIntCompatible
{
int ToInt();
}

public struct A : IToIntCompatible
{
public string data;
public int ToInt() => data.ToArray().GetHashCode();
}

public struct B : IToIntCompatible
{
public float data;
public int ToInt() => (int)Math.Round(data);
}

public struct C : IToIntCompatible
{
public bool data;
public int ToInt() => -1;
}


public class Example
{
/// <summary>
/// I wish I can add type D in the future without having to touch PlaceA and PlaceB
/// </summary>
public static readonly Type[] allTypes = new Type[] { typeof(A), typeof(B), typeof(C) };

/// <summary>
/// Cannot modify this function.
/// </summary>
private void Save<T>(T data) where T : struct { }

public void PlaceA(IToIntCompatible input)
{
switch (input)
{
case A a: Save<A>(a); break;
case B b: Save<B>(b); break;
case C c: Save<C>(c); break;
}
}

public void PlaceB(IToIntCompatible input)
{
switch (input)
{
case A a: Save<A>(a); break;
case B b: Save<B>(b); break;
case C c: Save<C>(c); break;
}
}
}

最佳答案

您必须使用反射来调用具有动态选择类型参数的泛型方法。

typeof(Example).GetMethod("Save").MakeGeneric(input.GetType()).Invoke(this, new object[]{input});

关于c# - 根据固定的类型列表多次调用泛型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51008171/

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