C# 如何使用;是";系统中的运算符。类型变量?
以下是我正在做的一件事:C# 如何使用;是";系统中的运算符。类型变量?,c#,C#,以下是我正在做的一件事: object ReturnMatch(System.Type type) { foreach(object obj in myObjects) { if (obj == type) { return obj; } } } 但是,如果obj是类型的子类,则它将不匹配。但是我希望函数返回的方式与我使用运算符is时的返回方式相同 我尝试了以下操
object ReturnMatch(System.Type type)
{
foreach(object obj in myObjects)
{
if (obj == type)
{
return obj;
}
}
}
但是,如果obj是类型的子类
,则它将不匹配。但是我希望函数返回的方式与我使用运算符is
时的返回方式相同
我尝试了以下操作,但无法编译:
if (obj is type) // won't compile in C# 2.0
我想出的最佳解决方案是:
if (obj.GetType().Equals(type) || obj.GetType().IsSubclassOf(type))
难道没有办法使用操作符is
使代码更干净吗?也许吧
type.IsAssignableFrom(obj.GetType())
is操作符指示将一个对象强制转换为另一个对象(通常是一个超类)是否“安全” 如果obj是“type”类型或其子类,则if语句将成功,因为将obj强制转换为(type)obj是“安全的”
请参阅:您不能使用“Is”关键字本身有什么原因吗
foreach(object obj in myObjects)
{
if (obj is type)
{
return obj;
}
}
编辑-我看到我遗漏了什么。伊萨克的建议是正确的;我已经测试并确认了
class Level1
{
}
class Level2A : Level1
{
}
class Level2B : Level1
{
}
class Level3A2A : Level2A
{
}
class Program
{
static void Main(string[] args)
{
object[] objects = new object[] {"testing", new Level1(), new Level2A(), new Level2B(), new Level3A2A(), new object() };
ReturnMatch(typeof(Level1), objects);
Console.ReadLine();
}
static void ReturnMatch(Type arbitraryType, object[] objects)
{
foreach (object obj in objects)
{
Type objType = obj.GetType();
Console.Write(arbitraryType.ToString() + " is ");
if (!arbitraryType.IsAssignableFrom(objType))
Console.Write("not ");
Console.WriteLine("assignable from " + objType.ToString());
}
}
}
不使用is运算符,但Type.IsInstanceOfType方法似乎就是您要查找的方法
面对此问题时,我使用了IsAssignableFrom方法
Type theTypeWeWant; // From argument or whatever
foreach (object o in myCollection)
{
if (theTypeWeWant.IsAssignableFrom(o.GetType))
return o;
}
另一种可能对您的问题有效也可能无效的方法是使用通用方法:
private T FindObjectOfType<T>() where T: class
{
foreach(object o in myCollection)
{
if (o is T)
return (T) o;
}
return null;
}
private T FindObjectOfType(),其中T:class
{
foreach(myCollection中的对象o)
{
if(o是T)
返回(T)o;
}
返回null;
}
(代码是从内存中编写的,没有经过测试)是的,有:C不允许这样做……啊,愚蠢的我,你不是在硬编码类型到代码本身,而是在传递类型变量以进行反射比较。
private T FindObjectOfType<T>() where T: class
{
foreach(object o in myCollection)
{
if (o is T)
return (T) o;
}
return null;
}