gpt4 book ai didi

c# - 如何在 C# 中将类型为 `object` 的变量转换为具有泛型类型的类?

转载 作者:行者123 更新时间:2023-11-30 18:13:41 25 4
gpt4 key购买 nike

我有一个用 C# 编写的项目。我正在尝试将一个对象转换为一个接受枚举对象作为通用参数的类。

我有以下类(class)

public class GenericEnumViewModel<TEnum> where TEnum : struct
{
[Required]
public TEnum? Value { get; set; }
public IEnumerable<SelectListItem> Options { get; set; }
}

这是我的枚举对象之一的示例

public enum TestEnum
{
First,
Second,
Third,
Fourth
}

最后,我有一个带有 object 的变量输入类似这样的内容

object obj = new GenericEnumViewModel<TestEnum>(); // Notice at this point I don't know that the generic type is `TestEnum` it could be any Enum.

我如何检查变量 obj工具 GenericEnumViewModel<Enum> ?另外我怎样才能创建一个名为 castedObj 的新变量?作为GenericEnumViewModel<Enum>

我正在尝试访问 castedObj.ValuecastedObj.Options .

我希望能够做这样的事情

var castedObj = obj as GenericEnumViewModel<Enum>;

if(castedObj != null)
{
// do something with castedObj.Value and castedObj.Options.
}

最佳答案

How can I check if the variable obj implements GenericEnumViewModel ?

您可以使用反射来做到这一点:

object obj = new GenericEnumViewModel<TestEnum>();

var objType = obj?.GetType();
var enumType =
objType != null && objType.IsGenericType && objType.GetGenericTypeDefinition() == typeof(GenericEnumViewModel<>) ?
objType.GetGenericArguments()[0] :
throw new InvalidOperationException($"Object is not a closed type of {typeof(GenericEnumViewModel<>).FullName}");

Also how can I make a new variable called castedObj as GenericEnumViewModel

由于多种原因,这是不可能的。以下行将无法编译:

// this code is invalid!
GenericEnumViewModel<Enum> model = new GenericEnumViewModel<TestEnum>();

首先,covariance仅允许用于 C# 中的接口(interface)、数组和委托(delegate)。

此外,即使类允许协方差,System.Enum是引用类型,而枚举是值类型。将枚举值分配给 System.Enum 变量涉及 boxing .这本身会使上述任务变得不可能。

但是,您可以借助非通用接口(interface)(或抽象基类)来解决这个问题,如下所示:

public interface IGenericEnumViewModel
{
Enum Value { get; }
GenericEnumViewModel<SelectListItem> Options { get; }
}

public class GenericEnumViewModel<TEnum> : IGenericEnumViewModel where TEnum : struct
{
[Required]
public TEnum? Value { get; set; }
public GenericEnumViewModel<SelectListItem> Options { get; set; }

Enum IGenericEnumViewModel.Value => Value.HasValue ? Value.Value : (Enum)null;
}

// ...

if (obj is IGenericEnumViewModel castedObj)
{
// do something with castedObj.Value and castedObj.Options.
Enum value = castedObj.Value;
// ...
}

奖金

截至 C# 7.3 you can use Enum in generic type constraints !

public class GenericEnumViewModel<TEnum> : IGenericEnumViewModel where TEnum : struct, Enum
{
// ...
}

关于c# - 如何在 C# 中将类型为 `object` 的变量转换为具有泛型类型的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51993451/

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