如何在c#中将类类型保存为变量?

时间:2013-07-09 14:47:18

标签: c# parametric-polymorphism

在c#中,你可以这样做吗?

type typeOfInt = type(int);
int x = (typeOfInt)1;

基本上我想将一个类型存储为变量,因此我可以将该变量用作强制转换。 我试图这样做,因为在我参数多态函数中,变量可以是2种类型中的1种。两种类型都有我想要使用的相同方法,但它不会让我使用它,因为它是一个变量类型。

    public static void SetFolderOrderValue<T>(T item, int value, Report reportObject)
    {
        if (!item.Exists)
        {
            reportObject.Log("The folder \"" + item.Name + "\" does not exist.");
            return;
        }
        try
        {
            item.SetProperty(folderOrderProperty, value);
            item.Update();
        }
        catch (SPException ex)
        {
            reportObject.Log("An error occurred when saving changes to the folder \"" + item.Name + "\". Maybe due to concurrent changes from another user. Please try again after a minute.\n" + Report.GetErrorInfo(ex));
        }
        catch (Exception ex)
        {
            reportObject.Log("An error occured with \"" + item.Name + "\":\n" + Report.GetErrorInfo(ex));
        }
    }

如果我至少可以将转换存储为值,那么我可以在函数中传递另一个布尔值,说明它是哪两种类型。

3 个答案:

答案 0 :(得分:9)

您正在谈论多态性,因此请使用它。

如果您有两种类型的相同的常用的方法,并且您有一个函数或一组函数来对其进行操作,请定义一个描述的interface在这两种类型之间共享的那组方法:

如果您谈论的类型名为SPFileSPFolder

public class SPFile : IMyNewInterface  {
   .....
}

public class SPFolder : IMyNewInterface  {
   ...
}

public static void SetFolderOrderValue<T>(T item, int value, 
              Report reportObject) where T : IMyNewInterface    {
     ...
}

答案 1 :(得分:3)

不,你不能这样做。

我的回答是假设Tigran's answer不适用,可能是因为您无法更改相关类型。

以下是实现您想要做的事情的一种方式:

var varOfTypeOne = item as TypeOne;
if(varOfTypeOne != null)
{
    varOfTypeOne.CallMethod();
    return;
}
var varOfTypeTwo = item as TypeTwo;
if(varOfTypeTwo != null)
{
    varOfTypeTwo.CallMethod();
    return;
}

另一种方法是通过dynamic

使用DLR
dynamic dynamicItem = item;
dynamicItem.CallMethod();

如果item的实际类型没有定义CallMethod,这将在运行时失败,因此您基本上会失去编译时安全性。

顺便说一句:采用无约束的泛型参数的void方法通常可以简单地替换为非泛型的方法,并且object作为参数类型。

答案 2 :(得分:1)

是的,你可以保存类型,但这可能是代码味道。

了解http://msdn.microsoft.com/en-us/library/system.object.gettype.aspxhttp://msdn.microsoft.com/en-us/library/system.type.aspx

这是一个例子

int x = 1;
var type = x.GetType();
Console.WriteLine(type);