C# 方法参数(对象)不是列表C类型#

C# 方法参数(对象)不是列表C类型#,c#,generics,C#,Generics,您好,我已经看过了,需要一些帮助,我正在使用反射从类中获取值,这些类有一个类似的属性,名为“Name” 我有办法 public static void GetName<T>(T Object) { xxxxxxx } 如何将使用限制为仅类对象,因为我希望阻止使用列表和其他类型 前 列出用户=。。。。。 var name=GetName(用户)。。。这是不允许的 有没有这样的方法,我试着把“class”和“where T:new()”放在一起 但它似乎并没有做到这一点 请帮

您好,我已经看过了,需要一些帮助,我正在使用反射从类中获取值,这些类有一个类似的属性,名为“Name” 我有办法

public static void GetName<T>(T Object)
{
    xxxxxxx
}
如何将使用限制为仅类对象,因为我希望阻止使用列表和其他类型 前

列出用户=。。。。。
var name=GetName(用户)。。。这是不允许的
有没有这样的方法,我试着把“class”和“where T:new()”放在一起

但它似乎并没有做到这一点

请帮助

在GetName()方法中,您需要测试对象类型,如果该类型无效,则引发异常

然而,这并不是一种有效的方法。您最好改用接口,这样就不必担心哪些类型是不允许的——因为无效类型的数量可能会达到无限的限制。

在GetName()方法中,您需要测试对象类型,如果它不是有效类型,则抛出异常

然而,这并不是一种有效的方法。您最好改用接口,这样就不必担心哪些类型是不允许的——因为无效类型的数量可能会达到无限的限制。

在GetName()方法中,您需要测试对象类型,如果它不是有效类型,则抛出异常

然而,这并不是一种有效的方法。您最好改用接口,这样就不必担心哪些类型是不允许的——因为无效类型的数量可能会达到无限的限制。

在GetName()方法中,您需要测试对象类型,如果它不是有效类型,则抛出异常


然而,这并不是一种有效的方法。您最好改用接口,这样您就不必担心哪些类型是不允许的——因为无效类型的数量可能会达到无限的限制。

正如Daniel在对原始问题的评论中所说,让每个对象实现一个包含属性的接口,并让您的方法将该接口作为其参数,这是限制它的最佳方式,例如:

public static void GetName(IPerson entity) { entity.Name = "Test"; }

正如Daniel在对原始问题的评论中所述,让每个对象实现一个包含属性的接口,并让您的方法将该接口作为其参数,将是限制它的最佳方式,例如:

public static void GetName(IPerson entity) { entity.Name = "Test"; }

正如Daniel在对原始问题的评论中所述,让每个对象实现一个包含属性的接口,并让您的方法将该接口作为其参数,将是限制它的最佳方式,例如:

public static void GetName(IPerson entity) { entity.Name = "Test"; }

正如Daniel在对原始问题的评论中所述,让每个对象实现一个包含属性的接口,并让您的方法将该接口作为其参数,将是限制它的最佳方式,例如:

public static void GetName(IPerson entity) { entity.Name = "Test"; }

你不能。如注释中所述,
List
是一个类。将其限制在类中将包括它

这是一种不幸的情况,在这种情况下,您可能不得不简单地依赖于调用代码所使用的契约,并对无效参数抛出异常

public static string GetName<T>(T Object)
{
    if(Object is IEnumerable) throw new ArgumentException();
    xxxxxxx
}
但要小心,因为有时很难预测(或者更确切地说,记住预测)哪一个将被调用

List<int> ints = new List<int>();

GetName(ints); // calls the IEnumerable version

object intsObj = (object)ints;
GetName(intsObj); // calls the non-IEnumerable version.
List ints=new List();
GetName(ints);//调用IEnumerable版本
对象intsObj=(对象)int;
GetName(intsObj);//调用非IEnumerable版本。
不过,更一般地说,听起来你可能在这里签订了一份不太理想的合同。如果您正在使用未过滤的泛型执行类似的操作,您可能也希望能够处理其中的集合,事实上,我不确定您为什么不能这样做。它们和其他东西一样都是物体

如果您试图限制它,您可能需要一个接口或基类,所有传递到此方法的对象都必须从该接口或基类继承。这将大大减少您传入.NET类的选项,但我无法想象如果您需要从某个内容获取“名称”,这些类会有什么用途

如果你走这条路,你有两个选择:

  • 限制参数本身
  • 限制泛型参数
这里的选择取决于方法的内容和返回类型,但我可能会选择前者

public static string GetName<T>(IObjectWithName Object)
{
    return Object.Name;
}
公共静态字符串GetName(IObjectWithName对象)
{
返回Object.Name;
}
不过,作为一个例子,这并不特别有趣,下面是如何限制泛型的

public static string GetName<T>(T Object)
    where T : IObjectWithName
{
    return Object.Name;
}
公共静态字符串GetName(T对象)
其中T:IObjectWithName
{
返回Object.Name;
}
请记住,您的对象需要实现该接口——例如,您不能将
DateTime
传递给此方法并期望它工作。如果您希望这样的“随机”输入,那么您可能还需要设置自己来接收集合类型



我应该提到的是,仅仅为了良好的实践,命名参数
对象
不是一个好习惯。这是C#中的一个关键字(或者更确切地说,是一个系统级类型)。所以你可能会有冲突。

你不能。如注释中所述,
List
是一个类。将其限制在类中将包括它

这是一种不幸的情况,在这种情况下,您可能不得不简单地依赖于调用代码所使用的契约,并对无效参数抛出异常

public static string GetName<T>(T Object)
{
    if(Object is IEnumerable) throw new ArgumentException();
    xxxxxxx
}
但要小心,因为有时很难预测(或者更确切地说,记住预测)哪一个将被调用

List<int> ints = new List<int>();

GetName(ints); // calls the IEnumerable version

object intsObj = (object)ints;
GetName(intsObj); // calls the non-IEnumerable version.
List ints=new List();
GetName(ints);//调用IEnumerable版本
对象intsObj=(对象)int;
GetName(intsObj);//调用非IEnumerable版本。
不过,更一般地说,我