我正试图在处理异常方面做得更好,但是当我尽力抓住它们时,我觉得我的代码变得非常丑陋,难以理解和混乱.我很想看看其他人如何通过提供实际例子和比较解决方案来解决这个问题.
我的示例方法从URL下载数据并尝试将其序列化为给定类型,然后返回填充了数据的实例.
首先,没有任何异常处理:
private static T LoadAndSerialize<T>(string url)
{
var uri = new Uri(url);
var request = WebRequest.Create(uri);
var response = request.GetResponse();
var stream = response.GetResponseStream();
var result = Activator.CreateInstance<T>();
var serializer = new DataContractJsonSerializer(result.GetType());
return (T)serializer.ReadObject(stream);
}
Run Code Online (Sandbox Code Playgroud)
我觉得这个方法很可读.我知道这个方法中有一些不必要的步骤(比如WebRequest.Create()可以接受一个字符串,我可以链接方法而不给它们变量)但是我会这样做,以便更好地与具有异常的版本进行比较 - 处理.
这是处理可能出错的一切的第一次尝试:
private static T LoadAndSerialize<T>(string url)
{
Uri uri;
WebRequest request;
WebResponse response;
Stream stream;
T instance;
DataContractJsonSerializer serializer;
try
{
uri = new Uri(url);
}
catch (Exception e)
{
throw new Exception("LoadAndSerialize : Parameter 'url' is malformed or …
Run Code Online (Sandbox Code Playgroud) 我有一个通用的方法,我拿一个IQueryable<T>
并IOrderedQuerable<T>
使用Linq-to-Entities 返回一个.
一个简单的input.OrderBy(p => p.something)
将无法工作,因为我不知道任何属性T
(我不能将此约束到接口).
将结果转换为(IOrderedQuerable<T>
)似乎工作,直到您尝试实际使用它与.Skip()
或.Take()
,此时您会收到运行时错误.
我想我理论上可以使用反射,看看我是否找到了一个int
或者什么,并构建一个表达式用作排序,但这看起来很脏.
有任何想法吗?
我有这两个非常简单的课程.
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public Group Group { get; set; }
}
public class Group
{
public int Id {get;set;}
public ICollection<Person> Teachers { get; set; }
public ICollection<Person> Students { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我希望EF保持Teachers
分离,Students
但是他们都混杂在一张Person
桌子里,无法区分它们.
有任何想法吗?
我有以下XML
<map version="1.0">
<properties>
<property name="color" value="blue" />
<property name="size" value="huge" />
<property name="texture" value="rugged" />
</properties>
</map>
Run Code Online (Sandbox Code Playgroud)
我正在尝试编写可以将其反序列化的类,这就是我所拥有的:
[XmlRoot("map")]
public class MyMap
{
[XmlAttribute("version")]
public decimal Version { get; set; }
[XmlElement("properties")]
public List<MyProperty> Properties { get; set; }
}
public class MyProperty
{
[XmlAttribute("name")]
public string Name { get; set; }
[XmlAttribute("value")]
public string Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
问题是我似乎无法读取属性列表,我只得到一个条目,它在Name和Value中都为null.
我需要设置一些神奇的属性来使其工作吗?
几天来,我一直在撞击这头,没有任何地方.我希望有一个捕获所有错误处理程序,重定向到控制器,向用户显示一个整洁的页面,以及执行相关的日志记录等.
问题是本地一切都很好,但是当我上传到azure时,我会得到标准的错误页面.
似乎azure不执行重定向,并忽略global.asax中的全局处理程序.
我没有在这里包含错误控制器的代码,因为我似乎从来没有这么远.
Web.Config中:
<customErrors mode="On" defaultRedirect="/error" redirectMode="ResponseRewrite"></customErrors>
路线入口:
routes.MapRoute("Error", "error/{*fluff}", new { controller = "Error", action = "Index", exception = new HttpException(404,"Direct call to controller") });
来自global.asax:
protected void Application_Error(object sender, EventArgs e)
{
var routeData = new RouteData();
routeData.Values["controller"] = "Error";
routeData.Values["action"] = "index";
routeData.Values["exception"] = Server.GetLastError();
Response.Clear();
Server.ClearError();
IController controller = new ErrorController();
controller.Execute(new RequestContext(new HttpContextWrapper(((MvcApplication)sender).Context), routeData));
}
Run Code Online (Sandbox Code Playgroud) 我想沿着这条路做点什么
var membersOfTypeEnum = typeof(myType).GetMembers().Where(i => i.IsEnum);
Run Code Online (Sandbox Code Playgroud)
但是,上面的模型i
是类型的MemberInfo
,并没有实现IsEnum
.
GetType(i).Name
说RuntimeType
哪个是包含真实类型的反射类型(我认为),但我似乎无法找到一种方法来获取成员本身的类型.
那么,我如何找到给定类型的成员(即枚举)?
编辑,我想说要反映这种类型:
public static class MyType
{
public enum EnumMember
{
One = 1,
Two = 2,
}
public static string NotEnumMember = "this is a string";
}
Run Code Online (Sandbox Code Playgroud)