代码之家  ›  专栏  ›  技术社区  ›  jim

C是否可以将类型传递到方法中,并让该方法返回该类型的对象?

c#
  •  7
  • jim  · 技术社区  · 16 年前

    这似乎是可能的。

    protected SameObjectTypeAsInputParameterObjectType GetAValue(someObject,TypeOrReturnObjectYouWant){
    
    //check to see if someObject is null, if not, cast it and send the cast back
    
    }
    
    7 回复  |  直到 12 年前
        1
  •  8
  •   Cerbrus    12 年前

    在您给出的示例中,只需执行以下操作,您可能会得到更好的服务:

    MyClass val = myObject as MyClass;
    

    但是,要回答您的问题-是的,答案是使用泛型:

    protected T GetAValue<T>(object someObject)
    {
        if (someObject is T)
        {
            return (T)someObject;
        }
        else
        {
            // We cannot return null as T may not be nullable
            // see http://stackoverflow.com/questions/302096/how-can-i-return-null-from-a-generic-method-in-c
            return default(T); 
        }
    }
    

    在这种方法中,t是 类型参数 . 在代码中使用t的方式与使用任何其他类型(例如字符串)的方式完全相同,但是请注意,在这种情况下,我们没有对t进行任何限制,因此类型t的对象只具有基的属性和方法 object ( GetType() , ToString() 等等)

    我们必须先声明T是什么,然后才能使用它-例如:

    MyClass val = GetAValue<MyClass>(myObject);
    string strVal = GetAValue<string>(someObject);
    

    有关更多信息,请查看 MSDN documentation on Generics

        2
  •  5
  •   MunkiPhD    16 年前

    这似乎是更好的内联。

    你能做的是:

    var requestedObject = someObject as TheTypeYouWant;
    

    当您这样声明时,将不会得到空引用异常。然后你可以做一个简单的

    if(requestedObject != null){
        ...
    }
    
        3
  •  3
  •   anonymous coward    16 年前

    使用泛型:

    T foobar<T>() where T : new()
    {
        return new T();
    }
    void somefunc()
    {
        Guid g = foobar<Guid>();
    }
    
        4
  •  1
  •   saret    16 年前

    您可以这样定义方法:

    protected TReturnType GetAValue<TReturnType>(Object someObject) where TReturnType : class
    {
     if(someObject is TReturnType) return (TReturnType) someObject;
     return null;
    }
    

    或者,如果不能保证t return type是引用类型,可以去掉泛型约束(t return type:class)并返回默认值(t return type)而不是空值-这将返回t return type的默认类型,其中int的默认类型为0…

        5
  •  1
  •   GvS    16 年前

    如果在编译时(编写代码时)知道类型,则可以使用泛型。

    如果您只知道运行时的类型(通过类型),则可以使用 Activator 班级。

        6
  •  1
  •   mfeingold    16 年前

    这种转换可以使用 as

    requestedObject as RequestedType
    

    用方法包装此表达式并不能真正购买任何内容

        7
  •  1
  •   Chris Marisic    16 年前

    我认为您可能正在寻找convert.changetype机制。

    private static object ChangeTypeTo<T>(this object value)
    {
        if (value == null)
            return null;
    
        Type underlyingType = typeof (T);
        if (underlyingType == null)
            throw new ArgumentNullException("value");
    
        if (underlyingType.IsGenericType && 
               underlyingType.GetGenericTypeDefinition().Equals(typeof (Nullable<>)))
        {
            var converter = new NullableConverter(underlyingType);
            underlyingType = converter.UnderlyingType;
        }
    
        // Guid convert
        if (underlyingType == typeof (Guid))
        {
            return new Guid(value.ToString());
        }
    
        // Check for straight conversion or value.ToString conversion
        var objType = value.GetType();
    
        // If this is false, lets hope value.ToString can convert otherwise exception
        bool objTypeAssignable2typeT = underlyingType.IsAssignableFrom(objType);
    
        // Do conversion
        return objTypeAssignable2typeT ? Convert.ChangeType(value, underlyingType)
                : Convert.ChangeType(value.ToString(), underlyingType);
    }