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

时间:2010-01-15 13:14:02

标签: c#

这似乎是可能的。

protected SameObjectTypeAsInputParameterObjectType GetAValue(someObject,TypeOrReturnObjectYouWant){

//check to see if someObject is null, if not, cast it and send the cast back

}

7 个答案:

答案 0 :(得分:11)

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

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类型的对象拥有基础objectGetType()ToString()等的属性和方法......)

我们必须在使用它之前明确声明T是什么 - 例如:

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

有关详细信息,请查看MSDN documentation on Generics

答案 1 :(得分:5)

这似乎可以更好地内联。

你可以做的是:

var requestedObject = someObject as TheTypeYouWant;

当您声明类似的内容时,您将不会获得空引用异常。然后你可以做一个简单的

if(requestedObject != null){
    ...
}

答案 2 :(得分:3)

使用泛型:

T foobar<T>() where T : new()
{
    return new T();
}
void somefunc()
{
    Guid g = foobar<Guid>();
}

答案 3 :(得分:1)

您可以像这样定义方法:

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

或者,如果您不能保证TReturnType是一个引用类型,您可以不使用泛型约束(TReturnType:class)并返回默认值(TReturnType)而不是null - 这将返回默认类型TReturnType,它将为0对于一个int ...

答案 4 :(得分:1)

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

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

答案 5 :(得分:1)

可以使用as

完成此类转换
requestedObject as RequestedType

在方法中包装此表达式并不能真正购买任何东西

答案 6 :(得分:1)

我认为您实际上可能正在寻找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);
}