C# 访问分配给var的实体的属性
请帮助我理解这一点。我有一个类似这样的工厂C# 访问分配给var的实体的属性,c#,.net,C#,.net,请帮助我理解这一点。我有一个类似这样的工厂 public static class FactoryForAnything { public static object GetInstanceOf<T>() where T : class { return Activator.CreateInstance(IsType<T>(), true); } private static Type IsType<T>(
public static class FactoryForAnything
{
public static object GetInstanceOf<T>() where T : class
{
return Activator.CreateInstance(IsType<T>(), true);
}
private static Type IsType<T>()
{
if (typeof(T).IsSubclassOf(typeof(EntityBaseSupertype)) == true)
{
return typeof(T);
}
else if (typeof(T).IsSubclassOf(typeof(ValueObject<>)) == true)
{
return typeof(T);
}
else
return null;
}
任何东西的公共静态类工厂
{
公共静态对象GetInstanceOf(),其中T:class
{
返回Activator.CreateInstance(IsType(),true);
}
私有静态类型IsType()
{
if(typeof(T).IsSubclassOf(typeof(EntityBaseSupertype))==true)
{
返回类型(T);
}
else if(typeof(T).IsSubclassOf(typeof(ValueObject))==true)
{
返回类型(T);
}
其他的
返回null;
}
意图接受类作为参数并返回该类的对象
EntityBaseSupertype hon =(EntityBaseSupertype) FactoryForAnything.GetInstanceOf<User>();
var hon = FactoryForAnything.GetInstanceOf<User>();
EntityBaseSupertype hon=(EntityBaseSupertype)FactoryForAnything.GetInstanceOf();
var hon=FactoryForAnything.GetInstanceOf();
使用EntityBaseSupertype调用工厂会获取对象,它被所有实体的抽象基类引用,因此我可以访问对象的字段/属性/成员。
使用var调用工厂可以获取对象,但不能访问字段/属性等。
我知道这是一个丑陋的设计,它不会被使用,但我的问题在于为什么我不能使用var访问对象?
为什么会这样?编译器试图从代码中确定
var
的真实类型,但对于
var hon = FactoryForAnything.GetInstanceOf<User>();
但这是一个运行时检查。编译器将把
hon
解释为EntityBaseSupertype
,并允许您访问公共属性和成员。CLR将在运行时查看对象元数据,如果对象不可分配给EntityBaseSupertype
,则返回null,而强制转换将抛出InvalidCasteexception,如果这是不可赋值的。首先,var
只是一个关键字,用于在声明变量时缩短已知类型
所需的写入时间。
这意味着编译器将根据用法确定变量的显式类型。
因此,在您的代码中,行:
var hon = FactoryForAnything.GetInstanceOf<User>();
你在做两件事:
- 从
返回到GetInstanceOf
的EntityBaseSupertype
,如果返回的对象
对该转换无效,则该对象将抛出类型
- 将强制转换的值分配给
类型的变量
EntityBaseSupertype
EntityBaseSupertype
的成员及其基类
一些旁注:
将始终返回类型为GetInstanceOf
的
对象,因此您应该将其签名更改为:
public static T GetInstanceOf<T>() where T : class
如果它可能返回一个不是public static T GetInstanceOf(),其中T:class
的T
,那么这个方法是有风险的,因为调用它的代码可能会得到意外的结果,并且不应该自己执行强制转换Type
<> L> >P>在这种情况下,您应该考虑使用<代码>从/<代码>中分配,而不是<代码> ISSub类< /C> >以支持。
- 使用关键字转换返回值更安全,因为它在失败时返回
,而不是抛出null
InvalidCastException
- 命名非布尔方法
会使代码的可读性稍差,因此可维护性稍差,而且IsXXXXX
方法会返回IsType
,这可能会导致其他方法在null
无效时抛出非指示性类型
异常
对象
?让它返回T
(当然,您需要执行显式转换)。我不确定,但您可以强制约束使用new()
的空构造函数,然后使用它来实例您的T
泛型类型。
object hon = FactoryForAnything.GetInstanceOf<User>();
EntityBaseSupertype hon = (EntityBaseSupertype) FactoryForAnything.GetInstanceOf<User>();
public static T GetInstanceOf<T>() where T : class