gpt4 book ai didi

c# - 确定派生自哪个泛型类型对象

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

我有以下类(class):

public abstract class CommandBase
{
... Stuff
}

public abstract class Command<TArgumentType>
: CommandBase where TArgumentType : class
{
protected TArgumentType Argument { get; private set; }

protected Command(TArgumentType argument)
{
Argument = argument;
}
}

public abstract class Command<TArgumentType, TReturnType>
: Command<TArgumentType> where TArgumentType : class
{
public TReturnType ReturnValue{ get; protected set; }

protected Command(TArgumentType argument) : base(argument)
{
}
}

如何确定对象是否属于 Command<TArgumentType> 类型或 Command<TArgumentType, TReturnType> ?我不知道 TArgumentType 或 TReturnType 是什么具体类型。或者我应该做一个简单的尝试/捕捉:

var returnValue = object.ReturnValue;

最佳答案

如果您在编译时不知道类型,那么 foo.ReturnValue 甚至不会编译,除非它是 dynamic 类型。

可以使用这样的东西:

static bool ContainsGenericClassInHierarchy(object value,
Type genericTypeDefinition)
{
Type t = value.GetType();
while (t != null)
{
if (t.IsGenericType
&& t.GetGenericTypeDefinition() == genericTypeDefinition)
{
return true;
}
t = t.BaseType;
}
return false;
}

这样调用它:

// Single type parameter
bool x = ContainsGenericClassInHierarchy(foo, typeof(Command<>));
// Two type parameters
bool y = ContainsGenericClassInHierarchy(foo, typeof(Command<,>));

请注意,这不会用于查找已实现的接口(interface),这有点棘手。

关于c# - 确定派生自哪个泛型类型对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6054705/

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