我有一个曾经有一个字符串返回类型的类。现在我发现我需要返回多个字符串。我想回复以下内容:
public string Test()
{
return ( new { ID = 5, Name= "Dave" } );
}
这是否可能,如果是,那么返回类型是什么?我知道这不是字符串..
答案 0 :(得分:9)
正如其他人所说,这里最好的办法是做一个名义上的类型。我建议名义类型与匿名类型具有相同的特征;也就是说,您应该考虑使类型不可变并考虑使其显示值相等。
可以将匿名类型作为对象返回,然后使用各种偷偷摸摸的技术使用其他地方返回的实例。您可以将对象转换为“动态”(在C#4中),然后使用匿名类型的属性,但这很慢并且缺少编译时类型检查。
您还可以使用“逐个演示”技巧,它可以帮助您进行编译时类型检查。但是,该技巧仅在匿名源对象和匿名示例对象来自同一程序集时才有效。
static T CastByExample<T>(object source, T example) where T : class
{
return source as T;
}
static object ReturnsAnonymous() { return new { X = 123 }; }
static void DoIt()
{
object obj = ReturnsAnonymous();
var example = new { X = 0 };
var anon = CastByExample(obj, example);
Console.WriteLine(anon.X); // 123
}
看看这是多么鬼鬼祟祟?我们使用方法类型推断和局部变量类型推断来告诉编译器“这两个东西是同一类型”。这允许您将匿名类型导出为对象并将其强制转换为匿名类型。
但你可能不应该这样做;如果你采取这种偷偷摸摸的技巧,那么你应该首先简单地定义名义类型。另外,就像我说的那样,只有在同一个程序集中的代码中创建示例和源对象时,该技巧才有效;两个不同程序集中的两个“相同”匿名类型不统一为同一类型。
答案 1 :(得分:3)
您返回的对象确实有一个类,但它是匿名的,因此您无法在代码中指定它。您只需将其作为object
引用返回:
public object Test() {
return new { ID = 5, Name= "Dave" };
}
请注意,匿名类型在方法范围之外是未知的,因此反射是访问其属性的唯一方法。
如果您希望能够方便地使用返回的对象,则应声明一个类:
public class TestResult
{
public int ID { get; set; }
public string Name { get; set; }
}
public TestResult Test() {
return new TestResult() { ID = 5, Name= "Dave" };
}
另一种选择是使用现有的类,如果它符合您的目的。 KeyValuePair
与您使用的内容接近,但属性当然会被命名为Key
和Value
,而不是ID
和Name
:
public KeyValuePair<int, string> Test() {
return new KeyValuePair<int, string>(5, "Dave");
}
答案 2 :(得分:0)
这是不可能的,因为匿名类仅在当前上下文中有效。如果你需要返回一个对象,那么你需要创建一个真正的类。
我假设您不小心将string
作为返回类型。
答案 3 :(得分:0)
Anonymous type
是直接从object
派生的类类型。
您可以将方法作为返回类型返回object
。
看看this。
答案 4 :(得分:0)
不,这是不可能的。您的选择是:
答案 5 :(得分:0)
您可以为此创建结构(或类)。
public struct IdAndName
{
public int Id;
public string Name;
public IdAndName(int id, string name)
{
ID = id;
Name = name;
}
}
你也可以使用元组&lt; T1,T2&gt;,(但不推荐这样做,因为属性没有被命名。
答案 6 :(得分:0)
class NewString
{
public int ID { get; set; }
public string Name { get; set; }
}
public NewString Test()
{
return ( new NewString() { ID = 5, Name = "Dave" } );
}
:)