【发布时间】: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
}
【问题讨论】:
标签: c#
这似乎是可能的。
protected SameObjectTypeAsInputParameterObjectType GetAValue(someObject,TypeOrReturnObjectYouWant){
//check to see if someObject is null, if not, cast it and send the cast back
}
【问题讨论】:
标签: c#
在您给定的示例中,您可能会更好地执行以下操作:
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
【讨论】:
default而不带(T)部分,它会自动返回方法返回类型的默认值。
这似乎内联做得更好。
你可以做的事情是这样的:
var requestedObject = someObject as TheTypeYouWant;
当你声明这样的东西时,你不会得到一个空引用异常。然后你可以做一个简单的
if(requestedObject != null){
...
}
【讨论】:
使用泛型:
T foobar<T>() where T : new()
{
return new T();
}
void somefunc()
{
Guid g = foobar<Guid>();
}
【讨论】:
foobar<T>() : where T new() 否则你将无法做到这一点。
你可以这样定义方法:
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对于一个整数...
【讨论】:
如果您在编译时(编写代码时)知道类型,则可以使用泛型。
如果你只知道运行时的类型(通过 Type),你可以使用Activator 类。
【讨论】:
这样的转换可以使用as来完成
requestedObject as RequestedType
将这个表达式包装在一个方法中并不能真正购买你的任何东西
【讨论】:
我认为您实际上可能正在寻找一种 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);
}
【讨论】: