簡體   English   中英

C#是否可以將類型傳遞給方法並讓方法返回該類型的對象?

[英]C# Is it possible to pass a type into a method and have the method return an object of that type?

這似乎是可能的。

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;

但是要回答你的問題 - 是的,答案是使用泛型:

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類型的對象擁有基礎object的屬性和方法( GetType()ToString()等...)

在我們使用它之前,我們必須明確聲明T是什么 - 例如:

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

有關更多信息,請查看有關泛型MSDN文檔

這似乎會更好地內聯。

你能做的是:

var requestedObject = someObject as TheTypeYouWant;

當您聲明類似的內容時,您將不會獲得空引用異常。 然后你可以做一個簡單的事情

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

使用泛型:

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

您可以像這樣定義方法:

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

或者,如果您不能保證TReturnType是引用類型,您可以省略泛型約束(TReturnType:class)並返回默認值(TReturnType)而不是null - 這將返回默認類型TReturnType,對於int,它將為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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM