我有一个C#方法说:
MyMethod(int num, string name, Color color, MyComplexType complex)
Run Code Online (Sandbox Code Playgroud)
使用反射,我如何清楚地识别任何方法的每个参数类型?我想通过参数类型执行一些任务.如果类型是简单的int,string或boolean然后我做一些事情,如果它是Color,XMLDocument等我做其他事情,如果它是用户定义的类型,如MyComplexType或MyCalci等,那么我想做某些任务.
我能够使用ParameterInfo检索方法的所有参数,并且可以遍历每个参数并获取它们的类型.但是如何识别每种数据类型?
foreach (var parameter in parameters)
{
//identify primitive types??
//identify value types
//identify reference types
}
Run Code Online (Sandbox Code Playgroud)
编辑:这是我的代码的一部分,以创建一个属性网格排序页面,我想显示所选方法的数据类型的参数列表.如果参数具有任何用户定义的类型/引用类型,那么我想进一步扩展它以显示其下的所有元素以及数据类型.
我有一个包含以下数据的数据集
Name Value Percent
0-3 months 0 0
3-12 months 0 0
1-5 years 1234.12 28
5-10 years 13144.11 68
10-15 years 0 0
Over 15 years 1233.44 14
Other Income 2245.12
Run Code Online (Sandbox Code Playgroud)
当我尝试
foreach (DataRow dr in dsMaturity.Tables[0].Select("name not like 'Other%'"))
{
TotalValue += double.Parse(dr["Value"].ToString());
}
Run Code Online (Sandbox Code Playgroud)
编辑:实际上,类似于上面的代码.我正在使用类似的循环将数据添加到显示存储桶,最终写入图表.
foreach (DataRow dr in dsMaturity.Tables[0].Rows)
{
//Add to the display bucket
}
Run Code Online (Sandbox Code Playgroud)
我得到的数据排序如下:
0-3 months
10-15 years
1-5 years
3-12 months
5-10 years
Over 15 years
Run Code Online (Sandbox Code Playgroud)
为什么?如何将数据排除?这是至关重要的,因为我在图表对象中显示数据.我在这里错过了什么吗?
我遇到一种情况,我有两种方法,一种在我的控制器类中接受poco,另一种则列出poco:
[AcceptVerbs("PUT")]
[ActionName("Item")]
public void SaveItem([FromBody] Item item)
{
m_controller.SaveItem(item);
}
[AcceptVerbs("PUT")]
[ActionName("Items")]
public void SaveItems([FromBody] List<Item> items)
{
m_controller.SaveItem(items);
}
Run Code Online (Sandbox Code Playgroud)
我的路由表如下所示:
routes.MapHttpRoute("Item Route",
"api/item/{orderId}",
new
{
controller = "MyOrder",
action = "Item",
orderId = RouteParameter.Optional
});
routes.MapHttpRoute("Items Route",
"api/items/{orderId}",
new
{
controller = "MyOrder",
action = "Items",
orderId = RouteParameter.Optional
});
Run Code Online (Sandbox Code Playgroud)
这按预期工作。但是我想到了重构代码以尝试重载。我试图重载控制器中的方法,只有一条路由,但失败并显示500错误-无效请求。我以为webapi将通过验证参数来解决调用-如果它是一个列表,则它将使用list作为参数调用重载方法,否则将调用另一个方法。我打算做类似的事情:
[AcceptVerbs("PUT")]
[ActionName("Item")]
public void SaveItem([FromBody] Item item)
{
m_controller.SaveItem(item);
}
[AcceptVerbs("PUT")]
[ActionName("Item")]
public void SaveItem([FromBody] List<Item> items)
{
m_controller.SaveItem(items);
}
Run Code Online (Sandbox Code Playgroud)
我的路由表如下所示:
routes.MapHttpRoute("Item Route",
"api/item/{orderId}",
new
{
controller …Run Code Online (Sandbox Code Playgroud) 我有一个asp.net页面,其中包含嵌入了一些数据的Iframe和一个ImageButton.在ImageButton单击事件(服务器端)我有Response.Redirct:
Response.Redirect("results.aspx");
Run Code Online (Sandbox Code Playgroud)
这总是在iframe中打开results.aspx.我希望results.aspx应该始终在父窗口中打开.到目前为止我尝试了以下但是没有效果:
Response.Redirect("<script language='javascript'>self.parent.location='results.aspx';</script>");
Response.Redirect("javascript:parent.change_parent_url('results.aspx');");
Run Code Online (Sandbox Code Playgroud)
作为Rifk的回应,我添加了ClientScriptManager..aspx有这个条目:
<asp:ImageButton ID="ImageButton_ok" ImageUrl="~/images/ok.gif"
OnClick="btnVerify_Click" OnClientClick="ValidateFields()"
runat="server" />
Run Code Online (Sandbox Code Playgroud)
Page_Load()中的代码:
ClientScriptManager cs = Page.ClientScript;
StringBuilder myscript = new StringBuilder();
myscript.Append("<script type=\"text/javascript\"> function ValidateFields() {");
myscript.Append("self.parent.location='default.aspx';} </");
myscript.Append("script>");
cs.RegisterClientScriptBlock(this.GetType(), "ButtonClickScript", myscript.ToString());
Run Code Online (Sandbox Code Playgroud)
btnVerify_Click具有主要的业务逻辑.如果我的业务逻辑失败,我将如何停止OnClientClick()触发?或者,如何在成功执行服务器端代码时触发?
如何使用反射获取c#中对象数组的元素和数据类型列表?
场景: 我的Web服务(asmx)中有一个带数组参数的方法.使用反射我正在读取方法参数并循环遍历属性.这是我的代码:
示例:
我有一个Web服务http://localhost/services/myservice.asmx.它有一种方法string GetServiceData(context mycontext).上下文类具有以下属性
- string name
- Account[] accounts
Run Code Online (Sandbox Code Playgroud)
帐户反过来了
- string acct_name
- string acct_address
Run Code Online (Sandbox Code Playgroud)
我需要动态读取服务以生成以下输出
<GetServiceData>
<mycontext>
<name>string</name>
<accounts>
<acct_name>string</acct_name>
<acct_address>string</acct_address>
</accounts>
</mycontext>
</GetServiceData>
Run Code Online (Sandbox Code Playgroud)
为此,我动态地读取MethodInfo并获取所有参数.然后我遍历参数以获取所有属性和数据类型的列表.如果属性中有数组元素,那么我需要获取该数组元素的所有元素.
解决方案(感谢Ani)
foreach (MethodInfo method in methods)
{
sb.Append("<" + method.Name + ">");
ParametetInfo parameters = method.GetParameters();
foreach(ParameterInfo parameter in parameters)
{
sb.Append("<" + parameter.Name + ">");
if (IsCustomType(parameter.ParameterType))
{
sb.Append(GetProperties(parameter.ParameterType));
}
else
{
sb.Append(parameter.ParameterType.Name);
}
sb.Append("</" + parameter.Name + ">");
}
sb.Append("</" + sMethodName + …Run Code Online (Sandbox Code Playgroud) 当我尝试在运行时在C#程序中检索对象的值时,我得到"对象与目标类型不匹配".
public void GetMyProperties(object obj)
{
foreach(PropertyInfo pinfo in obj.GetType().GetProperties())
{
if(!Helper.IsCustomType(pinfo.PropertyType))
{
string s = pinfo.GetValue(obj, null); //throws error during recursion call
propArray.Add(s);
}
else
{
object o = pinfo.PropertyType;
GetMyProperties(o);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我传递了我的Class BrokerInfo的一个对象,它有一个Broker类型的属性,其中inturn有属性 - FirstName和LastName(为简单起见所有字符串).
- BrokerInfo
- Broker
- FirstName
- LastName
Run Code Online (Sandbox Code Playgroud)
我试图递归检查自定义类型并尝试获取其值.我可以做类似的事情:
- Broker
- FirstName
- LastName
Run Code Online (Sandbox Code Playgroud)
请帮忙.
更新:能够在leppie的帮助下解决它:这是修改后的代码.
public void GetMyProperties(object obj)
{
foreach(PropertyInfo pinfo in obj.GetType().GetProperties())
{
if(!Helper.IsCustomType(pinfo.PropertyType))
{
string s = pinfo.GetValue(obj, null);
propArray.Add(s);
}
else
{
object o = …Run Code Online (Sandbox Code Playgroud) public class Shapes
{
public virtual void Color()
{
Console.WriteLine("Shapes");
}
}
public class Square : Shapes
{
public void Color()
{
Console.WriteLine("Square");
}
}
public class Test
{
public static void main()
{
Shapes s1 = new Shapes();
s1.Color();
Shapes s2 = new Square();
s2.Color();
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道基类是否已经定义了一些虚拟方法,那么在derive类中是否必须覆盖它们?同样,如果基类方法是抽象的,我们需要在派生类中实现该方法,但是override修饰符是必需的吗?如果省略override修饰符怎么办?
我有一个返回语言列表的方法.它有一个可以为null的languageId参数.如果传递,则该方法返回该语言,否则返回语言列表.
我想知道我是否可以简化这段代码,在一个语句中有一个select和where子句.
public List<Language> GetLanguageList(LanguageMapper ctx, int? languageId)
{
List<Language> languages = ctx.LANGUAGELIST
.Select(e => new Language()
{
LanguageId = e.LANGUAGEID,
LanguageName = e.LANGUAGE
})
.ToList();
if (languageId.HasValue)
{
languages = languages.Where(x => x.LanguageId == languageId).ToList();
}
return languages;
}
Run Code Online (Sandbox Code Playgroud) 我有一个表格,其中包含一行数据:
Account | OrderID | OrderName | Priority | Fasting |AssignedTo |ResultsTo |Location
----------------------------------------------------------------------------------------------------------------------------
12345 | REQ123456 | Lipid Panel (1.2) |Routine | Yes |Fast, Brook |Nurse Group |Fisher Rd, Woodbridge, NV
Run Code Online (Sandbox Code Playgroud)
现在,我希望UNPIVOT数据以下列形式显示用户:
GROUPCOL | LABEL | VALUE
-------------------------------------------------
General | Account | 12345
General | OrderID | REQ123456
General | OrderName | Lipid Panel (1.2)
General | Priority | Routine
General | Fasting | Yes
Result | ResultsTo | Nurse Group
Result | AssignedTo | Fast, Brook
Result | …Run Code Online (Sandbox Code Playgroud) 我有一个秒表变量,可以按以下格式获取值:
HH:MM:SS大部分时间.'HH'可以超过24小时 - 基本上任何有效的数字.
我对这个正则表达式的东西并不是那么好,但能够写出一些对大多数情况有益的东西但却无法验证小时是否为单位数.防爆.在正则表达式之下传递时间1:10:09,虽然它无效.有效小时部分应该是01.
//var stopWatchTime = '02:10:09'; //Valid
//var stopWatchTime = '00:10:09'; //Valid
//var stopWatchTime = '1234:10:09'; //Valid
//var stopWatchTime = ':10:09'; //Invalid
//var stopWatchTime = 'ax:10:09'; //Invalid
var stopWatchTime = '1:10:09'; //Invalid, should be 01:10:09.
if(!stopWatchTime .match(/^\d+:\d{2}:\d{2}$/)){
alert('invalid time- ' + stopWatchTime);
}
else{
alert('valid time - ' + stopWatchTime);
}
Run Code Online (Sandbox Code Playgroud)
我应该在正则表达式中更改它应该检查是否应检查任何数字,但小时部分应该有2位数或更多?
c# ×8
reflection ×3
asp.net ×2
arrays ×1
dataset ×1
datatable ×1
dynamic ×1
iframe ×1
imagebutton ×1
inheritance ×1
javascript ×1
jquery ×1
linq ×1
methods ×1
object ×1
oop ×1
overriding ×1
pivot ×1
propertyinfo ×1
put ×1
regex ×1
sorting ×1
sql-server ×1
time ×1
types ×1
unpivot ×1