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