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

Posted

技术标签:

【中文标题】C# 是不是可以将类型传递给方法并让该方法返回该类型的对象?【英文标题】:C# Is it possible to pass a type into a method and have the method return an object of that type?C# 是否可以将类型传递给方法并让该方法返回该类型的对象? 【发布时间】:2010-01-15 13:14:02 【问题描述】:

这似乎是可能的。

protected SameObjectTypeAsInputParameterObjectType GetAValue(someObject,TypeOrReturnObjectYouWant)

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


【问题讨论】:

【参考方案1】:

在您给定的示例中,您可能会更好地执行以下操作:

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://***.com/questions/302096/how-can-i-return-null-from-a-generic-method-in-c
        return default(T); 
    

在这个方法中,T 是一个类型参数。您可以在代码中以与使用任何其他类型(例如字符串)完全相同的方式使用 T,但请注意,在这种情况下,我们没有对 T 是什么设置任何限制,因此仅 T 类型的对象拥有基类objectGetType()ToString()等...)的属性和方法

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

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

欲了解更多信息,请查看MSDN documentation on Generics

【讨论】:

您需要在此处返回 default(T),因为 null 不适用于值类型 - 或者在方法上放置一个通用约束 => where T : class 你可以只返回default而不带(T)部分,它会自动返回方法返回类型的默认值。【参考方案2】:

这似乎内联做得更好。

你可以做的事情是这样的:

var requestedObject = someObject as TheTypeYouWant;

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

if(requestedObject != null)
    ...

【讨论】:

【参考方案3】:

使用泛型:

T foobar<T>() where T : new()

    return new T();

void somefunc()

    Guid g = foobar<Guid>();

【讨论】:

foobar&lt;T&gt;() : where T new() 否则你将无法做到这一点。 另外,这似乎符合标题中指定的标准,但不符合实际问题。 OP 想要返回一个转换为新类型的输入对象。【参考方案4】:

你可以这样定义方法:

protected TReturnType GetAValue<TReturnType>(Object someObject) where TReturnType : class

 if(someObject is TReturnType) return (TReturnType) someObject;
 return null;

或者,如果您不能保证 TReturnType 是引用类型,您可以放弃通用约束 (TReturnType : class) 并返回 default(TReturnType) 而不是 null - 这将返回 TReturnType 的默认类型,即 0对于一个整数...

【讨论】:

【参考方案5】:

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

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

【讨论】:

【参考方案6】:

这样的转换可以使用as来完成

requestedObject as RequestedType

将这个表达式包装在一个方法中并不能真正购买你的任何东西

【讨论】:

【参考方案7】:

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

【讨论】:

以上是关于C# 是不是可以将类型传递给方法并让该方法返回该类型的对象?的主要内容,如果未能解决你的问题,请参考以下文章

将二维数组信息传递给 c# 中的方法

将 C# 字符串传递给 C++,并将 C++ 结果(字符串、char*.. 任何)传递给 C#

将 DataTable 传递给非托管环境(visual c# 2005)

.net:C#的委托

在不同的返回类型上将字符串从 C# 传递到 C++ DLL 不同的文本编码

将 C# 数组传递给 Javascript