如何在 c# 中将类类型另存为变量
本文关键字:类型 另存为 变量 | 更新日期: 2023-09-27 18:21:44
在 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 种类型之间共享的一组方法,并且:
如果您正在谈论的类型被命名为 SPFile
和 SPFolder
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);