0

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

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

4

3 回答 3

9

你在谈论多态性,所以使用它。

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

如果您正在谈论的类型被命名SPFile并且SPFolder

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

public class SPFolder : IMyNewInterface  {
   ...
}

public static void SetFolderOrderValue<T>(T item, int value, 
              Report reportObject) where T : IMyNewInterface    {
     ...
}
于 2013-07-09T14:52:13.883 回答
3

不,你不能这样做。

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

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

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

另一种方法是通过以下方式使用 DLR dynamic

dynamic dynamicItem = item;
dynamicItem.CallMethod();

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

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

于 2013-07-09T14:56:00.547 回答
0

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

阅读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);
于 2013-07-09T14:53:59.397 回答