C# 如何根据对象类型强制转换为对象类型?

C# 如何根据对象类型强制转换为对象类型?,c#,reflection,gettype,object-type,C#,Reflection,Gettype,Object Type,我希望避免使用特定类型(请原谅我以前是如何使用的) var obj=新列表(); obj=(列表)EasyCache.Instance.Item(cacheKey) 类似于:obj=(obj.GetType()?)EasyCache.Instance.Item(cacheKey)您可以使用 obj = (dynamic)EasyCache.Instance.Item(cacheKey); 这不是一个好方法,但它应该有效。您可以使用 obj = (dynamic)EasyCache.Insta

我希望避免使用特定类型(请原谅我以前是如何使用的)

var obj=新列表();
obj=(列表)EasyCache.Instance.Item(cacheKey)
类似于:obj=(obj.GetType()?)EasyCache.Instance.Item(cacheKey)

您可以使用

obj = (dynamic)EasyCache.Instance.Item(cacheKey);
这不是一个好方法,但它应该有效。

您可以使用

obj = (dynamic)EasyCache.Instance.Item(cacheKey);

这不是一个好方法,但它应该可以工作。

如果不想在赋值中重复类型名称,可以将声明和赋值组合起来:

var obj = (List<Category>)EasyCache.Instance.Item(cacheKey)
var obj=(列表)EasyCache.Instance.Item(cacheKey)
请注意,您创建的空
列表将被丢弃,因为您将在下一行中覆盖它。您似乎创建了一个新的,只是为了允许在声明中使用
var


var
dynamic
是很好的工具,但它们不应该用来取代静态类型检查

如果不想在赋值中重复类型名称,可以将声明和赋值组合起来:

var obj = (List<Category>)EasyCache.Instance.Item(cacheKey)
var obj=(列表)EasyCache.Instance.Item(cacheKey)
请注意,您创建的空
列表将被丢弃,因为您将在下一行中覆盖它。您似乎创建了一个新的,只是为了允许在声明中使用
var


var
dynamic
是很好的工具,但它们不应该用来取代静态类型检查

您必须使
Item
方法通用,那么,它的实现是什么样子的?它是公共对象项(字符串键)-如何使其通用?您想做什么?“casting”不会更改引用类型的基础类型,它只是更改方法的绑定方式。您想转换对象吗?@dnrhead的答案有效,而且正是您想要的(尽管它被无缘无故地否决)。证明@dnrhead答案有效的小提琴:。同样,我不知道为什么它被否决了。如果这样做,你甚至不会失去intellisense你必须使
Item
方法通用,那么它的实现看起来如何?它是公共对象项(字符串键)-我如何使它通用?你想做什么?“casting”不会更改引用类型的基础类型,它只是更改方法的绑定方式。您想转换对象吗?@dnrhead的答案有效,而且正是您想要的(尽管它被无缘无故地否决)。证明@dnrhead答案有效的小提琴:。同样,我不知道为什么它被否决了。如果你这样做,你甚至不会失去智能感知我不知道为什么这是被否决的。。。它实际上是有效的,而且是一种非常好的方法+我做了一把小提琴来证明你的答案是正确的,如果你愿意,你可以加上:嗨,为什么这不是一个好方法?(只有我看到它会在运行时解析…
dynamic
在这种情况下只会绕过编译器检查,强制转换可能“有点”慢,但没有什么不合理的地方:因为对于方法的其余部分,您使用的是具体类型(不是
dynamic
变量),它根本不会影响该类型的性能。我不认为有任何更安全的方法来做这件事,如果你想类型安全。。。您可以使用反射,但这同样很慢,并且会在代码上产生各种各样的问题:这是干净的,就像转换为变量类型(在编译时不知道)一样有效,我投了反对票,原因如下:1)
dynamic
应该在编译时不知道类型(或者想要支持duck类型)时使用。在这种情况下,OP知道类型,但它太懒了,无法在施法时重复该类型。2) 它将所有类型检查推迟到运行时,在运行时更难检测问题。如果在上面的行中更改了类型,但是下游没有任何更改来反映新类型,那么这些bug直到运行时才被发现。3) 不清楚为什么强制转换是必要的-它不会改变底层对象,所以强制转换可能根本不必要。我不确定为什么会被否决。。。它实际上是有效的,而且是一种非常好的方法+我做了一把小提琴来证明你的答案是正确的,如果你愿意,你可以加上:嗨,为什么这不是一个好方法?(只有我看到它会在运行时解析…
dynamic
在这种情况下只会绕过编译器检查,强制转换可能“有点”慢,但没有什么不合理的地方:因为对于方法的其余部分,您使用的是具体类型(不是
dynamic
变量),它根本不会影响该类型的性能。我不认为有任何更安全的方法来做这件事,如果你想类型安全。。。您可以使用反射,但这同样很慢,并且会在代码上产生各种各样的问题:这是干净的,就像转换为变量类型(在编译时不知道)一样有效,我投了反对票,原因如下:1)
dynamic
应该在编译时不知道类型(或者想要支持duck类型)时使用。在这种情况下,OP知道类型,但它太懒了,无法在施法时重复该类型。2) 它将所有类型检查推迟到运行时,在运行时更难检测问题。如果在上面的行中更改了类型,但是下游没有任何更改来反映新类型,那么这些bug直到运行时才被发现。3) 不清楚为什么强制转换是必要的-它不会改变底层对象,所以强制转换可能根本就不必要。