在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));
}
}
如果我至少可以将转换存储为值,那么我可以在函数中传递另一个布尔值,说明它是哪两种类型。
答案 0 :(得分:9)
您正在谈论多态性,因此请使用它。
如果您有两种类型的相同的或常用的方法,并且您有一个函数或一组函数来对其进行操作,请定义一个描述的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 {
...
}
答案 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
:
dynamic dynamicItem = item;
dynamicItem.CallMethod();
如果item
的实际类型没有定义CallMethod
,这将在运行时失败,因此您基本上会失去编译时安全性。
顺便说一句:采用无约束的泛型参数的void方法通常可以简单地替换为非泛型的方法,并且object
作为参数类型。
答案 2 :(得分:1)
是的,你可以保存类型,但这可能是代码味道。
了解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);