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

这似乎是可能的。

protected SameObjectTypeAsInputParameterObjectType GetAValue(someObject,TypeOrReturnObjectYouWant){ //check to see if someObject is null, if not, cast it and send the cast back } 

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

 MyClass val = myObject as MyClass; 

但是要回答你的问题 – 是的,答案是使用generics:

 protected T GetAValue(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(myObject); string strVal = GetAValue(someObject); 

有关更多信息,请查看有关generics的MSDN文档

这似乎会更好地内联。

你能做的是:

 var requestedObject = someObject as TheTypeYouWant; 

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

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

使用generics:

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

您可以像这样定义方法:

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

或者,如果您不能保证TReturnType是引用类型,您可以省略generics约束(TReturnType:class)并返回默认值(TReturnType)而不是null – 这将返回默认类型TReturnType,对于int,它将为0 …

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

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

这种转换可以使用as来完成

 requestedObject as RequestedType 

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

我想你可能真的在寻找Convert.ChangeType机制。

 private static object ChangeTypeTo(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); }