2015-11-02 79 views
0

如何将var传递给函数?如何将var传递给C#中的函数

我需要建立以下未知的数据模型,并将它传递给我的功能,它使用喊解析RazorRenderer它:

var emailData = new {name="value" , name2="value2" ... , nameN="valueN"} 

功能不能接收无功,所以我们使用的对象,但随后我们不能把它转换回来,我们得到一个异常时,调用:

string htmlBody = render.Parse(File.ReadAllText(TemplatePath), emailData); 

当我做到以下几点,在相同功能的工作原理:

var emailData = new { UserRequest = "hello", UserEmail = "[email protected]" }; 
string htmlBody = render.Parse(File.ReadAllText(TemplatePath), emailData); 

但是,当尝试将emailData传递给它不起作用的函数时,有什么想法?

我可以将函数渲染出来,并将结果传递给函数,但我认为在函数内部执行它可能会很好。

顺便说一句,我试过JSON序列化和Decerialize,没有运气。

+0

相关:http://stackoverflow.com/q/33019305/993547。 –

+0

你有什么理由需要它作为匿名对象吗?通常,当传递函数范围外的对象时,最好创建一个具体类型。 –

+0

在第一个示例中调用'render.Parse'时会得到什么异常? –

回答

0

如果我正确理解你的问题,这是不可能的。匿名类型名称不能在用户代码中表示,因此无法将它们作为函数的输入参数。

最好的办法是创建一个类型并将其用作查询的返回值,然后将其传递给该函数。例如,

class YourDataClass { 
    public string ColumnName; 
} 

var query = (from name in some.Table 
      select new YourDataClass { ColumnName = name }); 
YourMethod(query); 

...

YourMethod(IEnumerable<YourData> enumerable); 

在这种情况下,虽然,你只能选择一个字段,所以它可能是更容易只需直接选择字段。这将导致查询被键入为字段类型的IEnumerable。

+0

“匿名类型名称不能在用户代码中表示,因此无法将它们作为函数的输入参数。” >这是错误的。它们可以被表示,意味着什么,它们可以被传递。 –

+1

@PatrickHofman虽然我能理解这个答案中的措辞是错误的,但情绪是正确的。没有办法明确引用匿名类型。他们可以传递的唯一方法是1)作为普通对象,因为OP已经在做,或者2)在推断泛型参数的泛型方法中。 (对于双重通知,抱歉,编辑我早先的评论为时已晚)。 – hvd