System.Web.Compilation.TemplateControlCompiler.DataBoundProperty C# (CSharp) Method

DataBoundProperty() private method

private DataBoundProperty ( ControlBuilder builder, Type type, string varName, string value ) : string
builder System.Web.UI.ControlBuilder
type System.Type
varName string
value string
return string
		string DataBoundProperty (ControlBuilder builder, Type type, string varName, string value)
		{
			value = TrimDB (value, true);
			CodeMemberMethod method;
			string dbMethodName = builder.Method.Name + "_DB_" + dataBoundAtts++;
			CodeExpression valueExpression = null;
			value = value.Trim ();
			
			bool need_if = false;
			if (startsWithBindRegex.Match (value).Success) {
				valueExpression = CreateEvalInvokeExpression (bindRegexInValue, value, true);
				if (valueExpression != null)
					need_if = true;
			} else
				if (StrUtils.StartsWith (value, "Eval", true))
					valueExpression = CreateEvalInvokeExpression (evalRegexInValue, value, false);
			
			if (valueExpression == null)
				valueExpression = new CodeSnippetExpression (value);
			
			method = CreateDBMethod (builder, dbMethodName, GetContainerType (builder), builder.ControlType);
			CodeVariableReferenceExpression targetExpr = new CodeVariableReferenceExpression ("target");

			// This should be a CodePropertyReferenceExpression for properties... but it works anyway
			CodeFieldReferenceExpression field = new CodeFieldReferenceExpression (targetExpr, varName);

			CodeExpression expr;
			if (type == typeof (string)) {
				CodeMethodInvokeExpression tostring = new CodeMethodInvokeExpression ();
				CodeTypeReferenceExpression conv = new CodeTypeReferenceExpression (typeof (Convert));
				tostring.Method = new CodeMethodReferenceExpression (conv, "ToString");
				tostring.Parameters.Add (valueExpression);
				expr = tostring;
			} else
				expr = new CodeCastExpression (type, valueExpression);

			CodeAssignStatement assign = new CodeAssignStatement (field, expr);
			if (need_if) {
				CodeExpression page = new CodePropertyReferenceExpression (thisRef, "Page");
				CodeExpression left = new CodeMethodInvokeExpression (page, "GetDataItem");
				CodeBinaryOperatorExpression ce = new CodeBinaryOperatorExpression (left, CodeBinaryOperatorType.IdentityInequality, new CodePrimitiveExpression (null));
				CodeConditionStatement ccs = new CodeConditionStatement (ce, assign);
				method.Statements.Add (ccs);
			} else
				method.Statements.Add (assign);

			mainClass.Members.Add (method);
			return method.Name;
		}
TemplateControlCompiler