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



在 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));
        }
    }

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

你说的是多态性,所以使用它。

如果您有 2 种具有相同通用方法的类型,并且您有一个函数或一组函数来操作它们,请定义一个interface来描述这 2 种类型之间共享的一组方法,并且:

如果您正在谈论的类型被命名为 SPFileSPFolder

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

不,你不能这样做。

我的回答假设Tigran的答案不适用,也许是因为您无法更改所讨论的类型。

以下是实现您想要执行的操作的一种方法:

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作为参数类型。

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

阅读 http://msdn.microsoft.com/en-us/library/system.object.gettype.aspx和 http://msdn.microsoft.com/en-us/library/system.type.aspx

这是一个例子

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

最新更新